从 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 的相关文章

  • Dagger 2 没有生成我的组件类

    我正在使用 Dagger 2 创建我的依赖注入 几个小时前它还在工作 但现在不再生成组件 这是我创建组件的地方 public class App extends Application CacheComponent mCacheCompon
  • DbContext 和 ObjectContext 有什么区别

    From MSDN 表示工作单元和存储库模式的组合 使您能够查询数据库并将更改分组在一起 然后将这些更改作为一个单元写回存储 DbContext在概念上类似于ObjectContext 我虽然DbContext只处理与数据库的连接以及针对数
  • 干净构建 Java 命令行

    我正在使用命令行编译使用 eclipse 编写的项目 如下所示 javac file java 然后运行 java file args here 我将如何运行干净的构建或编译 每当我重新编译时 除非删除所有内容 否则更改不会受到影响 cla
  • Android 如何将总天数准确更改为年、月、日?

    我正在做一个应用程序 该应用程序与根据给定的生日日期输入获取一个人的年龄有关 为此 我从下面的代码中获取从该日期到当前日期的总天数 String strThatDay 1991 05 10 SimpleDateFormat formatte
  • Qt - ubuntu中的串口名称

    我在 Ubuntu 上查找串行端口名称时遇到问题 如您所知 为了在 Windows 上读取串口 我们可以使用以下代码 serial gt setPortName com3 但是当我在 Ubuntu 上编译这段代码时 我无法使用这段代码 se
  • 上网本上可以进行Android开发吗? [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我想使用我的上网本进行 Android 开发 但是当我尝试使用 Eclipse 运行 SDK 时 没有加载任何内容 上网本对于 Android 开发来
  • 找不到符号 NOTIFICATION_SERVICE?

    package com test app import android app Notification import android app NotificationManager import android app PendingIn
  • 通过系统应用程序以编程方式静默安装 apk(无需 root)

    我有带有 android sharedUserId android uid system UID 1000 的系统级应用程序 设备未root INSTALL PACKAGES 权限包含在清单中 我可以静默安装下载的 apk 吗 我已经发现这
  • 动态添加 ASP.Net 控件

    我有一个存储过程 它根据数据库中存储的记录数返回多行 现在我想有一种方法来创建 div 带有包含该行值的控件的标记 如果从数据库返回 10 行 则 10 div 必须创建标签 我有下面的代码来从数据库中获取结果 但我不知道如何从这里继续 S
  • 在java中为组合框分配键

    我想添加一个JComboBox在 Swing 中这很简单 但我想为组合中的每个项目分配值 我有以下代码 JComboBox jc1 new JComboBox jc1 addItem a jc1 addItem b jc1 addItem
  • 长轮询会冻结浏览器并阻止其他 ajax 请求

    我正在尝试在我的中实现长轮询Spring MVC Web 应用程序 http static springsource org spring docs 2 0 x reference mvc html但在 4 5 个连续 AJAX 请求后它会
  • 在 Android 应用程序资源中使用 JSON 文件

    假设我的应用程序的原始资源文件夹中有一个包含 JSON 内容的文件 我如何将其读入应用程序 以便我可以解析 JSON See 开放原始资源 http developer android com reference android conte
  • 使用 C# 读取 Soap 消息

  • 使用 svn 1.8.x、subclise 1.10 的 m2e-subclipse 连接器在哪里?

    我读到 m2e 的生产商已经停止生产 svn 1 7 以外的任何版本的 m2e 连接器 Tigris 显然已经填补了维护 m2e subclipse 连接器的空缺 Q1 我的问题是 使用 svn 1 8 x 的 eclipse 更新 url
  • 方法优化 - C#

    我开发了一种方法 允许我通过参数传入表 字符串 列数组 字符串 和值数组 对象 然后使用这些参数创建参数化查询 虽然它工作得很好 但代码的长度以及多个 for 循环散发出一种代码味道 特别是我觉得我用来在列和值之间插入逗号的方法可以用不同的
  • Dagger 2 中“HasFragmentInjector”的实际用法是什么

    我之前已经实现了 dagger2 v2 2 但现在他们也添加了 dagger android 部分 所以我正在用它创建示例项目 我知道旧的方法论 Provide and Modules and 成分等注释 但从 Dagger 2 8 开始
  • 双枢轴快速排序和快速排序有什么区别?

    我以前从未见过双枢轴快速排序 是快速排序的升级版吗 双枢轴快速排序和快速排序有什么区别 我在 Java 文档中找到了这个 排序算法是双枢轴快速排序 作者 弗拉基米尔 雅罗斯拉夫斯基 乔恩 本特利和约书亚 布洛赫 这个算法 在许多数据集上提供
  • Oracle Data Provider for .NET 不支持 Oracle 19.0.48.0.0

    我们刚刚升级到 Oracle 19c 19 3 0 所有应用程序都停止工作并出现以下错误消息 Oracle Data Provider for NET 不支持 Oracle 19 0 48 0 0 我将 Oracle ManagedData
  • Spring Rest 和 Jsonp

    我正在尝试让我的 Spring Rest 控制器返回jsonp但我没有快乐 如果我想返回 json 但我有返回的要求 完全相同的代码可以正常工作jsonp我添加了一个转换器 我在网上找到了用于执行 jsonp 转换的源代码 我正在使用 Sp
  • 当从finally中抛出异常时,Catch块不会被评估

    出现这个问题的原因是之前在 NET 4 0 中运行的代码在 NET 4 5 中因未处理的异常而失败 部分原因是 try finallys 如果您想了解详细信息 请阅读更多内容微软连接 https connect microsoft com

随机推荐

  • 如何向 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 中的变量地址