我正在开发一个适用于 x86 的 Android 应用程序,需要与 C 进行一些集成。我一直在使用 swig/JNI 来实现这一点,并且大部分情况都运行顺利。然而,指针给了我一些错误。
我的问题是,我能够成功引用模拟器 (ARM) 中的变量地址,但在设备 (x86) 上,情况就不那么顺利了。
使用来自的示例这个链接,我发现C中任何分配的变量的地址一旦传递给Java,就会变成NULL。例如...
Swig 生成的 JNI:
SWIGEXPORT jlong JNICALL Java_exampleJNI_new_1intp(JNIEnv *jenv, jclass jcls) {
jlong jresult = 0 ;
int *result = 0 ;
(void)jenv;
(void)jcls;
result = (int *)new_intp();
LOGI("Result is %x", result);
*(int **)&jresult = result;
LOGI("JResult is %x", jresult);
return jresult;
}
包含 new_intp() 的源文件:
static int *new_intp() {
return (int *) calloc(1,sizeof(int));
}
我有打印语句检查地址的值,因为它源自 C 并传递到 Java。在 new_intp() 中,新变量被分配了一个好看的地址,但是一旦该值返回到 JNI 并被转换为 jlong,它就会变成 NULL。
换句话说,*(int **)&jresult = result;
导致 jresult 为 0。
为什么会出现这种情况? x86 是否有一些特殊性不允许 JNI 使用指针?或者是因为我是在物理设备而不是模拟器上测试它?
Regards