Java:在 JNI 中访问静态最终字段

标签 java android java-native-interface android-5.0-lollipop android-runtime

有没有办法在 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/

相关文章:

java - 为什么我的Font是从文件创建的,为什么还要调用GraphicsEnvorinment.registerFont()?

android - 如何将一个元素对齐到相对布局中另一个元素的中心和上方?

android - 有什么方法可以在 Android native 代码中获取全局变量 gDVM?

android - 错误:找不到类org.opencv.core.Mat

android - 从 native 代码查找 Dalvik 堆栈上 Java 局部变量的内存地址

java - 无法显示我的ArrayList

java - 正则表达式在某些情况下无法正常工作

java - 使用 Java 从 XML 中按属性值获取子节点

java - ExpandableListView 中的 onClick 子项

java - 内存泄漏在 MAT 中显示为 GC root : Native Stack