首页 / JAVA / 将指针从C传递到Java变为NULL
将指针从C传递到Java变为NULL
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了将指针从C传递到Java变为NULL,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1478字,纯文字阅读大概需要3分钟。
内容图文
![将指针从C传递到Java变为NULL](/upload/InfoBanner/zyjiaocheng/760/1fae4c5813c04a2c8aca098359963bde.jpg)
我正在开发一个针对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使用指针?或者是因为我在物理设备而不是模拟器上测试它?
问候
解决方法:
在我看来它可能是一个字节序问题.
*(int **)&jresult = result;
如果int是32位,而jresult是64位,那么在big-endian架构上,这可能会产生意想不到的结果.
& jresult是指向64位值的指针,因此如果将其转换为指向32位值的指针,那么您将指向两个组成32位字的低位寻址.在大端系统中,这将是最重要的词.因此,在将32位字写入64位值的最高端后,您将获得64位值,这比您预期的大2 ^ 32倍.
如果您的LOGI调用将参数视为32位int,并从64位值隐式向下转换它,那么它将给出0.
你能看出这是否有效吗?
jresult = (jlong) result;
内容总结
以上是互联网集市为您收集整理的将指针从C传递到Java变为NULL全部内容,希望文章能够帮你解决将指针从C传递到Java变为NULL所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。