JNI:javah修改作为内部类的参数

安东尼

我有一个JNI函数android.graphics.Bitmap$Config作为参数传递Config是的内在类Bitmap当我运行javah时,我得到了不正确的标头签名(将其截断为单个参数):

Landroid_graphics_Bitmap_Config

这等效于:

Landroid/graphics/Bitmap/Config

代替:

Landroid_graphics_Bitmap_00024Config

这是等效的

Landroid/graphics/Bitmap$Config

javah生成的内容是错误的,因为JNI将抛出一个错误,以寻找内部类_00024表示形式$该人javah似乎并不暗示有任何设置可以纠正此问题。这是一个限制javah吗?

亚历克斯·科恩

看起来,当涉及内部类类型的参数时,JDK中存在一个错误(至少不一致)

这是重现该问题的示例类:

public class A {

    public native void a(android.graphics.Bitmap.Config b);
    public native void a(android.graphics.Bitmap.Config b, int c);
    static {
        System.loadLibrary("hello-libs");
        a(null);
    }
}

如果javah用于生成本机头,则将获得

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_example_hellolibs_MainActivity */

#ifndef _Included_com_example_hellolibs_MainActivity
#define _Included_com_example_hellolibs_MainActivity
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     A
 * Method:    a
 * Signature: (Landroid/graphics/Bitmap/Config;)V
 */
JNIEXPORT void JNICALL A_a__Landroid_graphics_Bitmap_Config_2
  (JNIEnv *, jobject, jobject);

/*
 * Class:     A
 * Method:    a
 * Signature: (Landroid/graphics/Bitmap/Config;I)V
 */
JNIEXPORT void JNICALL Java_A_a__Landroid_graphics_Bitmap_Config_2I
  (JNIEnv *, jobject, jobject, jint);

#ifdef __cplusplus
}
#endif
#endif

和 -

java.lang.UnsatisfiedLinkError:未找到针对无效Aa(android.graphics.Bitmap $ Config)的实现(尝试过Java_A_a和Java_A_a__Landroid_graphics_Bitmap_00024Config_2)

但是此错误很少影响由javah生成的标头javac -h dir,因为通常本机方法是使用“短”名称生成的,例如Java_A_a,它并不关心参数的类型。

解决方案是按照https://bugs.openjdk.java.net/browse/JDK-8145897中的建议手动更改方法签名

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

JNI:javah修改作为内部类的参数

来自分类Dev

Java:修改作为参考传递的参数

来自分类Dev

为什么不能修改作为函数内部的参数传递的列表?

来自分类Dev

如何修改作为函数参数的切片?

来自分类Dev

Perl:修改作为参数传递给子例程的变量

来自分类Dev

无法修改作为参数传递给函数的指针变量

来自分类Dev

使用内部类作为类型参数

来自分类Dev

方法的返回值正在修改作为方法参数传递的对象

来自分类Dev

Python不允许我修改作为参数传递的列表

来自分类Dev

方法的返回值正在修改作为方法参数传递的对象

来自分类Dev

Java中的DefaultListModel修改作为参数传递给addElement方法的String

来自分类Dev

修改作为 C 中函数参数传递的字符串

来自分类Dev

修改作为输入传递的函数

来自分类Dev

泛型类作为带有内部类型的参数

来自分类Dev

泛型类作为带有内部类型的参数

来自分类Dev

在C ++中使用指向内部类对象的指针作为外部类构造函数参数

来自分类Dev

内部类作为休眠组件

来自分类Dev

受保护的内部方法不允许内部类作为参数

来自分类Dev

如何从函数内部修改作用域变量?

来自分类Dev

Python - 内部类的哪些参数?

来自分类Dev

将父类的实例变量作为函数的参数传递给内部类

来自分类Dev

修改匿名内部类中的外部变量

来自分类Dev

Java-使内部类能够修改外部类

来自分类Dev

C ++更改作为函数参数传递的指针值

来自分类Dev

更改作为参数给出的数组的值

来自分类Dev

如何更改作为参数传递给函数的变量?

来自分类Dev

Android活动作为内部类

来自分类Dev

JNI GetMethodID不适用于内部类的构造函数

来自分类Dev

从控制器内部修改作用域变量。通话后

Related 相关文章

  1. 1

    JNI:javah修改作为内部类的参数

  2. 2

    Java:修改作为参考传递的参数

  3. 3

    为什么不能修改作为函数内部的参数传递的列表?

  4. 4

    如何修改作为函数参数的切片?

  5. 5

    Perl:修改作为参数传递给子例程的变量

  6. 6

    无法修改作为参数传递给函数的指针变量

  7. 7

    使用内部类作为类型参数

  8. 8

    方法的返回值正在修改作为方法参数传递的对象

  9. 9

    Python不允许我修改作为参数传递的列表

  10. 10

    方法的返回值正在修改作为方法参数传递的对象

  11. 11

    Java中的DefaultListModel修改作为参数传递给addElement方法的String

  12. 12

    修改作为 C 中函数参数传递的字符串

  13. 13

    修改作为输入传递的函数

  14. 14

    泛型类作为带有内部类型的参数

  15. 15

    泛型类作为带有内部类型的参数

  16. 16

    在C ++中使用指向内部类对象的指针作为外部类构造函数参数

  17. 17

    内部类作为休眠组件

  18. 18

    受保护的内部方法不允许内部类作为参数

  19. 19

    如何从函数内部修改作用域变量?

  20. 20

    Python - 内部类的哪些参数?

  21. 21

    将父类的实例变量作为函数的参数传递给内部类

  22. 22

    修改匿名内部类中的外部变量

  23. 23

    Java-使内部类能够修改外部类

  24. 24

    C ++更改作为函数参数传递的指针值

  25. 25

    更改作为参数给出的数组的值

  26. 26

    如何更改作为参数传递给函数的变量?

  27. 27

    Android活动作为内部类

  28. 28

    JNI GetMethodID不适用于内部类的构造函数

  29. 29

    从控制器内部修改作用域变量。通话后

热门标签

归档