有没有办法在 JNI 中访问静态最终字段?
public class TryMe {
public int a = 1;
public final int b = 2;
public static int c = 3;
public static final int d = 4;
}
C++ JNI 代码:
jclass cls = env->FindClass("my/package/TryMe");
jfieldID a = env->GetFieldID(cls, "a", "I"); //OK
jfieldID b = env->GetFieldID(cls, "b", "I"); //OK
jfieldID c = env->GetStaticFieldID(cls, "c", "I"); //OK
jfieldID d = env->GetStaticFieldID(cls, "d", "I"); //Error!
最后一次调用返回 NULL 并失败。知道为什么吗?
最佳答案
已解决:我被 proguard 咬伤了。
我最初认为这可能是 android 运行时中的错误,但事实并非如此。我相信 proguard 不知道也不关心 JNI,所以它决定优化掉“常量”。将此添加到 proguard.cfg 后:
keep class my.package.TryMe {
public static final int d;
}
问题消失了。
关于Java:在 JNI 中访问静态最终字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28242431/