繁体   English   中英

JNI:javah mangles参数是内部类

[英]JNI: javah mangles arguments that are inner classes

我有一个JNI函数,它将android.graphics.Bitmap$Config作为参数传递。 ConfigBitmap的内部类。 当我运行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:找不到void Aa的实现(android.graphics.Bitmap $ Config)(试过Java_A_a和Java_A_a__Landroid_graphics_Bitmap_00024Config_2)

但是这个bug很少影响javahjavac -h dir生成的头文件,因为通常本机方法是用'short'名称生成的,例如Java_A_a ,它不关心参数的类型。

解决方案是手动更改方法签名,如https://bugs.openjdk.java.net/browse/JDK-8145897中所述

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM