【发布时间】:2011-07-19 19:52:19
【问题描述】:
我正在开发一个适用于 x86 的 Android 应用程序,该应用程序需要与 C 进行一些集成。我一直在使用 swig/JNI 来实现这一目标,并且大部分情况下运行顺利。但是,指针一直给我一些错误。
我的问题是我能够在模拟器 (ARM) 中成功引用变量地址,但在设备 (x86) 上,事情就不那么顺利了。
使用this link 中的示例,我发现一旦该地址传递给Java,C 中任何已分配变量的地址都会变为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 使用指针?还是因为我是在物理设备而不是模拟器上测试它?
问候
【问题讨论】:
-
哎呀,非得叫它
this吗?我相信这是 Java 和 C++ 中的保留关键字。 -
在 C 中,它不是。不过,给任何变量起这个名字可能不是最好的习惯。将对其进行编辑。
-
哦,对不起,我被你的问题标题弄糊涂了。这是一个 C 或 C++ 问题,我们可以适当地标记它吗?
-
你知道jlong是64位类型吗?
-
是的,我想我知道地址返回给 Java 是 64 位长。
标签: java android c java-native-interface android-ndk