从 C 到 Java 传递指针变成 NULL

2023-12-02

我正在开发一个适用于 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


其实,这是一个指针别名问题。 SWIG 使用老式的 C 指针技术,当优化开启时,这些技术在较新的 GCC 中不起作用。专门埋在 SWIG 文档中说要做什么:

重要的

如果您打算使用 gcc 开启的优化 (例如 -O2),请确保您还使用 -fno-strict-aliasing 进行编译。 从 gcc-4.0 开始,GCC 优化变得更加积极 并会导致代码在严格别名优化时失败 打开。请参阅C/C++ 到 Java 类型映射部分了解更多详细信息。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从 C 到 Java 传递指针变成 NULL 的相关文章

随机推荐

  • 如何向 eclipse C 项目添加库?

    I need to add a C library to C project in Eclipse indigo What I ve done so far I ve downloaded and installed the library
  • MVC3 中的 URL 重写

    我正在为当地一所大学使用 MVC3 开发一个项目 我遇到了一个要求 我被困住了 找不到任何出路 假设我的 URL 是 www abc com要求是 如果我们在 URL 后输入教师姓名 我们将获得该教师的详细视图 例如 www abc com
  • Tomcat Servlet 类NotFoundException

    我创建了简单的 servlet package servlets import javax servlet ServletException import javax servlet http HttpServlet import java
  • 在 Java Swing 应用程序中创建在线帮助 - 使用 pdf 用户文档

    我正在尝试将一些用户文档链接到我的 Java Swing 应用程序 用户文档是 pdf 格式 我希望能够单击应用程序中的按钮 打开某种 pdf 渲染器来显示我的 userdoc pdf 我不想使用运行时执行命令 我尝试了以下方法 但没有取得
  • 如何在 JSP 中将值插入到 derby 数据库中?

    我在 JSP 中创建了一个表单来将数据插入到 derby 中的数据库中 但它不起作用 数据库名称是 CUSTOMER 表格 ID int CNAME varchar ADDRESS varchar PHONENUMBER varchar c
  • 无法监视 HttpSession / Mockito

    我想要部分嘲笑Httpsession但为此我需要监视它而不是嘲笑它 并且如果没有已经被嘲笑的请求对象 我就无法获得它的接口 请帮忙 换句话说 我怎样才能得到一个对象HttpSession没有HttpServletRequest object
  • 将 Google 图表另存为 pdf

    我正在尝试将饼图另存为 pdf 文件 如下所示http keepcoding ehsanabbasi com php convert google chart to png and pdf 在 php chartsrc 中包含 javasc
  • 无法在 SD 卡上写入文件

    我试图在 SD 卡上写入照片 但没有成功 我已经获得了在可移动存储中写入的权限 并且 SD 卡已安装 另外 我检查了 SD 卡的路径是否存在 并且得到了肯定的结果 失败的地方是当我使用mkdir 功能 它返回 false 并且没有创建文件
  • java中的selenium异常(org.openqa.selenium.remote.UnreachableBrowserException)

    我知道有很多线程正在运行 但没有一个线程可以解决这个问题 我正在尝试使用 selenum 获取 aspx 页面 但它在这行代码处抛出 UnreachableBrowserExceptionWebDriver driver new Chrom
  • 如何为uuid设置cookie

    我有一个网站 每次加载 刷新页面时都会生成一个 uuid 我想使用 cookie 使某个值在一段时间内保持不变 有谁知道可以帮助我的脚本吗 不确定您为什么要求脚本 或者这里的问题是什么 要设置 cookie 只需使用 if empty CO
  • Angular 2如何加载具有子依赖项的第3方供应商节点模块

    正在加载单节点模块在 Angular 2 中角度 cliwiki 中对引导项目进行了很好的描述 只是好奇 如何在使用 angular cli 引导的项目中很好地加载更复杂的节点模块 例如 angular2 apollo 依赖于几个子依赖项
  • 如何使用 AVFoundation 设置逐帧生成的视频的方向?

    我正在编写一个 iPhone 应用程序 它从相机获取视频 通过一些 OpenGL 着色器代码运行它 然后使用以下命令将输出写入视频文件AVFoundation 该应用程序以横向运行 或者 因此所有录制的视频都应该是横向的 我在开始录制之前使
  • 在 Redhat 上从 C++ 解压文件:system() 的替代方法

    我需要在运行 C 程序时解压缩文件 如中所述在 RedHat 机器上执行 C 代码之前等待解压完成 为此 我目前正在执行以下操作 system unzip usr bin File ZippedFile gz d usr bin File
  • 仅对数字列求和并将值除以总计

    我在对数据框进行一些计算时遇到问题 这是我的 DF 还有更多行和列 我想做的是 步骤 1 对于每个月 我想对资产列进行求和 例如 所有 asset Jan 2018 并输出为 DF 步骤 2 然后 对于每个公司 我想将每月的资产除以该月的总
  • C#:为什么要签署程序集?

    在我接管的一些 C 代码中 在 Visual Studio 2005 中 我注意到程序集都使用相同的签名 snk file 为什么前一作者会以这种方式签署程序集 签署程序集是否必要以及什么 不签字会不会有错 有什么缺点 签署程序集 是否会导
  • JavaScript 中如何四舍五入到小数点后一位?

    你能将 JavaScript 中的数字四舍五入到小数点后一个字符 正确四舍五入 吗 我尝试了 10 round 10 但它在 int 末尾留下了两位小数 Math round num 10 10有效 这是一个例子 var number 12
  • 使用 numpy.frompyfunc 将广播添加到带参数的 python 函数

    从像这样的数组db 这将大约是 1e6 300 and a mask 1 0 1 向量 我将目标定义为第一列中的 1 我想创建一个out由其中相应行组成的向量db匹配mask and target 1 其他地方都是零 db np array
  • google api 机器学习 我可以使用 API KEY 吗?

    出于学习目的 我尝试使用机器学习 ml API https cloud google com ml engine reference rest v1 projects models list 我无法确定是否可以使用 API KEY 而不是
  • 限制表中数据范围的声明性方法

    我想学习一种声明性方法来解决我不时遇到的与独占日期范围相关的数据约束问题 下面是一个简化的示例 我有物品和这些物品的价格 我希望价格的有效日期范围是相互排斥的 没有重叠 据我了解 Oracle 的情况 用户定义的函数不符合使用条件CONST
  • 从 C 到 Java 传递指针变成 NULL

    我正在开发一个适用于 x86 的 Android 应用程序 需要与 C 进行一些集成 我一直在使用 swig JNI 来实现这一点 并且大部分情况都运行顺利 然而 指针给了我一些错误 我的问题是 我能够成功引用模拟器 ARM 中的变量地址