PointerByReference 不返回值

2023-12-28

我正在尝试通过 JNA 从 Java 调用 C++ 函数。我想传入一个字符串,然后返回一个字符串。这是通过使用 in 参数和 out 参数来完成的。我用PointerByReference来代表char**输出参数。对 C++ 的调用有效,但是PointerByReference调用后为空。

我的代码基于引用指针 https://github.com/twall/jna/blob/master/www/ByRefArguments.md文档。有什么想法我做错了吗?

我已向 C++ 添加了 print 语句,以确保它不会将指针设置为 null,而且绝对不会。所以我在使用JNA时肯定有一些错误。但什么?

C++ code

void processRequest(char* input, char** output, int* outputLength)
{

    // Variable output size from processInput

    std::string sOutput = processInput(input);


    char* results = new char[sOutput.length() + 1];

    strncpy(results, sOutput.c_str(), sOutput.length());

    results[sOutput.length()] = '\0';


    output = &results;

    outputLength = new int(strlen(results) + 1);

}

Java代码

java 是这样调用的:

public class RunRequestT1 {
    private static final Logger log = LoggerFactory.getLogger(MyLibWrapperImpl.class);

    static boolean envVarsSetupDone = false;

    static interface MyLib extends Library {

        MyLib INSTANCE = (MyLib) Native.loadLibrary("N:\\sys1\\sys1_dist\\MyLib\\MyLib9.8.Q.P3.G15.T\\bin\\MyLib.dll", MyLib.class);

        public void processRequest(String request, PointerByReference bufp, IntByReference lenp);

        public void clearMemoryPtr(PointerByReference bufp, IntByReference lenp);
    }

    public static void main(String[] args) throws IOException {

        System.out.println("sys1: Reading request");
        String request = FileUtils.readFileToString(new File("C:\\dev\\prj\\single-request.xml"), "UTF-8");

        System.out.println("sys1: Pricing request");
        String response = processRequest(request);

        System.out.println(response);

    }

    public static String processRequest(String request) {

        System.out.println("sys1: prepare args");
        // code based on https://github.com/twall/jna/blob/master/www/ByRefArguments.md
        PointerByReference bufp = new PointerByReference();
        IntByReference lenp = new IntByReference();

        System.out.println("sys1: making call");
        MyLib.INSTANCE.processRequest(request, bufp, lenp);

        System.out.println("reading response");
        System.out.println("bufp: " + bufp.getValue());
        System.out.println("lenp: " + lenp.getValue());
        Pointer p = bufp.getValue();
        byte[] buffer = p.getByteArray(0, lenp.getValue());
        String response = Native.toString(buffer);
        //String response = p.getString(0);

        // de-allocate memory buffer
        System.out.println("cleaning memory");
        MyLib.INSTANCE.clearMemoryPtr(bufp, lenp);
        return response;
    }
}

Stdout

当我调用它时,我得到这样的结果:

sys1: Reading request
sys1: Pricing request
sys1: prepare args
sys1: making call
reading response
bufp: null
lenp: 0
Exception in thread "main" java.lang.NullPointerException
    at com.calyon.gcm.MyLibwrapper.main.RunRequestT1.priceRequest()
    at com.calyon.gcm.MyLibwrapper.main.RunRequestT1.main()

我试图将其保持在最低限度,事实上并没有发生太多事情。

我已经使用 JNA 版本 3.4 和 3.5 进行了测试


您不需要为长度“返回”分配新指针,而是需要写入现有指针,例如

*outputLength = strlen(results) + 1;

您还需要写入给定的缓冲区指针,而不仅仅是为本地参数分配新值:

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

PointerByReference 不返回值 的相关文章

  • 是否可以获取指向装箱非托管值类型的指针?

    是否可以获取指向装箱非托管值类型的指针 而无需编写对每个支持的类型进行强制转换的大型 switch 语句 就像是 object val Contains a boxed unmanaged value such as int long by
  • 有界通配符相关的编译器错误

    我想知道这段代码有什么问题 Map 但我试图说得更具体 这个问题在这个旧的 Apache 线程 ht
  • 读取不失真的灰度 PNG 图像文件

    我需要读取和处理大量的灰度 PNG 文件 我的意思是 如果它们在 Photoshop 或 GIMP 中打开 则图像模式为灰度 而不是具有灰度值的 RGB 图像 ImageIO 似乎没有实现这一点 它似乎将所有图像文件视为 sRGB 这会破坏
  • memccpy 返回比 src 起始地址更低的内存地址

    我有一个学校项目 我必须重新编码memccpy 功能 我使用 2 个程序来检查我的代码是否正常工作 第一个是只有一个主程序的小程序 第二个程序是另一个学生开发的 可以找到here https github com yyang42 mouli
  • Math.Sin、Math.Cos 和 Math.Tan 精度以及正确显示它们的方法

    我正在用 C 编写一个计算器 textBoxResult是一个文本框 我在其中显示数字 recount是以度为单位获取角度并以弧度为单位返回的函数 我的角度是从texBoxInput public double recount int nu
  • 为什么Windsor只能拦截虚方法或接口方法?

    我正在阅读文档 发现如果不使用接口 那么 Windsor 只能拦截虚拟方法 这是 Windsor 的限制还是 C 语言的限制 我正在寻找深入的答案 C 语言在这里完全无关 问题是拦截在运行时级别如何工作 一种技术是从类继承 实现接口并将其用
  • 为什么我在这段代码中不断得到两个相同的随机值? [复制]

    这个问题在这里已经有答案了 可能的重复 为什么我的随机数生成器在 C 中不是随机的 https stackoverflow com questions 932520 why does it appear that my random num
  • 通过 ssh 发送命令并读取输出结果

    我有代码通过 ssh 连接到远程服务器并向其发送 2 个或更多命令 例如 cd export home ops bin和 viewlinkload time 20131205 19 但我没有看到命令执行 也没有收到结果 我需要获取服务器返回
  • 如何在Phone类库项目中添加ResourceDictionary并访问它

    我正在开发一个项目 其中我有一个引用图书馆项目的子项目 在我的库项目 电话类库 中 如何创建 ResourceDictionary xaml 其中我需要添加一些样式并在 xaml 文件和 cs 文件中使用它 我需要访问 xaml 文件中的
  • 使用 InputStream 通过 TCP 套接字接收多个图像

    每次我从相机捕获图像时 我试图将多个图像自动从我的 Android 手机一张一张地发送到服务器 PC 问题是read 函数仅在第一次时阻塞 因此 从技术上讲 只有一张图像被接收并完美显示 但在那之后当is read 回报 1 该功能不阻塞
  • 为什么我从 c# 到 js 得到不同的 MD5 哈希值?

    我有一个用于加密密码的 C 函数 System Security Cryptography MD5CryptoServiceProvider md5Provider new System Security Cryptography MD5C
  • Eclipse 在单独的窗口中打开代码

    我正在 eclipse 中编程 在两个显示器设置上运行 在其中一台显示器上 我只获得了项目资源管理器和编辑器作为自定义透视图 而在另一台显示器上 我获得了其他工具 例如控制台 调试 任务 变量 断点等 例如 当我单击任务视图中的任务时 这将
  • 如何从 jenkins 的现有项目生成 .hpi 插件

    我正在尝试使用 jenkins 的性能插件 但最新版本存在一些问题 如链接中所述 https issues jenkins ci org browse JENKINS 27100 https issues jenkins ci org br
  • Jackson 的 ObjectMapper 和 SQL 中的 RowMapper

    我们正在使用对象映射器 当将 ObjectMapper 与 RowMapper 一起使用时 是否应该在每个 mapRow 内部 如下所示 声明它 还是在 mapRow 外部声明为类公共成员 我认为根据本文 它应该作为公共类成员在外部 我应该
  • 如何正确地将十六进制转义添加到字符串文字中?

    当你有C语言的字符串时 你可以在里面直接添加十六进制代码 char str abcde a b c d e 0x00 char str2 abc x12 x34 a b c 0x12 0x34 0x00 这两个示例在内存中都有 6 个字节
  • 用 lambda 表达式替换匿名函数

    我在 Java 8 映射操作中传递一个函数 Intellij 告诉我它可以用 lambda 表达式替换 但我不知道如何在不创建中间对象结构的情况下做到这一点 这就是我所做的 List
  • 混合语言源目录布局

    我们正在运行一个使用多种不同语言的大型项目 Java Python PHP SQL 和 Perl 到目前为止 人们一直在自己的私有存储库中工作 但现在我们希望将整个项目合并到一个存储库中 现在的问题是 目录结构应该是什么样的 我们应该为每种
  • C# 中的快速字符串解析

    在 C 中解析字符串最快的方法是什么 目前我只是使用字符串索引 string index 并且代码运行合理 但我忍不住认为索引访问器所做的连续范围检查必须添加一些东西 所以 我想知道我应该考虑哪些技术来增强它 这些是我最初的想法 问题 使用
  • 使用 Crypto++ 和 .NET 的 CFB 模式下的 TripleDES

    我正在尝试使用 TripleDES 使用 C 应用程序获得相同的结果 该应用程序具有Crypto https www cryptopp com 和 NET应用程序使用三重DESCryptoServiceProvider https msdn
  • ASP.NET API:尚未为此 DbContext 配置数据库提供程序

    我正在尝试从我的 Net Core API 项目连接到 MySql 数据库 这是我的上下文类 public class MyContext DbContext public MyContext public MyContext DbCont

随机推荐

  • IE7 Javascript 并使用字符串作为数组

    奇怪的行为 我只是发布这个问题 看看是否有人知道其原因 或者我的代码是否完全错误 string text yip let s take some weird character alert text 0 all major browsers
  • 如何通过OpenCV和python打开IP摄像头URL?

    我已经在 MacX Lion 上安装了支持 ffmpeg 的 opencv import cv2 import cv import base64 import time import urllib2 import numpy as np f
  • 在 Firefox 中加载图像时显示边框和标题

    我的火狐浏览器有问题 我的网站上有很多图片 当我在 Firefox 中浏览页面时 加载图像时边框和图像标题可见 下载完成后 该边框 标题就会消失并被图像取代 这种情况只发生在火狐浏览器中 Chrome 和其他浏览器加载没有任何边框和标题的图
  • Scala + Android 新手

    我正在尝试使用 scala andriod 插件 但在运行和配置 AVD 时遇到问题 我从 sbt 收到以下错误 android 模拟器启动 NexusOne 成功 总时间 0 s 完成 2011年11月18日 7 07 53 PM 模拟器
  • Rabbitmq 使用单个同步调用检索多条消息

    有没有办法使用单个同步调用接收多条消息 当我知道队列中有 N 条消息 N 可以是小于 10 的小值 时 我应该能够执行类似于 channel basic get String queue boolean autoAck int number
  • 通过 Crystal Web 服务以编程方式设置 Crystal Server 上 Crystal Report 的数据源

    如何更改在 Crystal 服务器中运行的 Crystal 报表在运行时使用的数据源 数据库服务器 用户名 密码 我有一台水晶服务器 并上传了具有一组数据源的报告 托管在服务器 A 用户 A 密码 A 上的 SQL Server 2005
  • Cache-Control: max-age=0 和 no-cache 有什么区别?

    标题Cache Control max age 0意味着内容立即被视为过时 并且必须重新获取 这实际上与Cache Control no cache 我有同样的问题 并在搜索中找到了一些信息 您的问题作为结果之一出现 这就是我所决定的 有两
  • sqlcipher - sqlcipher 的安全性如何?它被黑客入侵了吗?

    它在页面级别加密 SQLite 数据库 好吧 没问题 但是你的源代码呢 它已编译 但即使已编译 有人也可以反编译它 检索您的密码并解密数据库吗 SQLCipher 的安全性如何 根据SQLCipher设计文档 http sqlcipher
  • 是否有更快的代码用于向表中添加新行 - Excel VBA

    每当我的代码找到要添加到其中的新值时 我都会向表中添加一个新行 我为此使用的代码Set newRow ProjectTable ListRows Add工作正常 但这使其运行速度非常慢 是否有代码可以完成相同的任务但运行速度更快 Dim P
  • 如何在flutter中自定义标签栏宽度?

    您好 我们可以在 flutter 中自定义标签栏宽度吗 我的标签栏宽度是固定的 所以当我的标签栏中有长文本时 它不会完全显示 我想让我的标签栏宽度根据内容灵活 所以当我的文本只是短文本时 标签栏宽度会很小 当文本是长文本时 选项卡栏宽度大于
  • 来自 github 存储库的 Scala sbt 文件依赖项

    是否可以包含来自 github 的依赖项 存储库没有 jar 文件 只有 build sbt 文件和源文件夹 您可以创建一个新项目 该项目指向您的源代码build sbt然后使用dependsOn lazy val projectIDepe
  • 下标运算符中的逗号运算符?

    我对逗号运算符很困惑 我从来没有见过这样的代码和这样的语法 但我很好奇它在任何地方都有用吗 为什么它在 c 20 中被弃用 include
  • 如何创建全局热键?

    我想创建一个热键 因此当您按下时 它应该将一些字节写入我附加的进程中的内存地址 到目前为止 我有这段代码 但似乎只有当我专注于主应用程序时它才有效 否则它将无法工作 我想让它工作 所以它会做我想做的事 即使我不关注主应用程序 private
  • xlsxwriter下拉列表Excel错误

    要对特定列中的所有行应用数据验证 请使用以下顺序 import xlsxwriter workbook xlsxwriter Workbook data validate2 xlsx worksheet workbook add works
  • 冲突解决后强制在 TFS 中合并

    TFS 2010 VS 2010 我们在 TFS 中遇到了一种情况 开发人员没有遵循正确的合并程序 当我将他的开发者目录与主干进行比较时 我得到了许多标记为不同或根本不在主干中的文件 他最后一次合并 签入主干是在 2011 05 26 他最
  • CUDA 功能和 CUDA 版本:兼容吗?

    我有一台具有 1 1 计算能力 CUDA GPU 的机器 我想重新安装 CUDA 我想我会选择 5 0 CUDA 功能和 CUDA 版本之间是否存在兼容性之类的问题 将 CUDA 5 0 与 C C 1 1 一起使用时会遇到麻烦吗 图形处理
  • 如何使用 overpass-api 获取我所在点附近的兴趣点?

    我正在使用 Overpass API 我无法找到我的地点附近 大约 100 200 英里 的一些兴趣点 咖啡馆 医院 学校 我只有纬度和经度 Overpass API 提供了使用您的地名获取 POI 的机会 但我没有 我只有坐标 我怎样才能
  • 如何在 Java EE 中使用 CDI 编写 main()?

    我有一个想要运行的无客户端应用程序 它没有客户端 但会进行 HTTP 调用并充当其他服务的客户端 它可能会运行几个小时或几天 但不需要定期运行 只需一次性 我想在 Java EE 7 容器中运行它 因为标准上下文依赖注入 CD 和标准 JA
  • Django 模型定义竞赛

    如果模型 A 依赖于所定义的模型 B 但模型 B 也依赖于所定义的模型 A 那么如何处理这种情况 例如 我有 class event models Model competition start models DateField compe
  • PointerByReference 不返回值

    我正在尝试通过 JNA 从 Java 调用 C 函数 我想传入一个字符串 然后返回一个字符串 这是通过使用 in 参数和 out 参数来完成的 我用PointerByReference来代表char 输出参数 对 C 的调用有效 但是Poi