【问题标题】:JNA: char array as function parameterJNA:char数组作为函数参数
【发布时间】:2012-11-24 09:49:42
【问题描述】:

使用 JNA,我正在加载一个用 C++ 编写的 dll 并调用该 C++ 函数中存在的函数:

 int xxfunction(Char* ptr){...}

这里我需要发送一个 char 数组,以便函数为其赋值。基本上我需要通过引用传递 char 数组。

根据 JNA 文档,Java 中的 C++ char* 等效为 String,因此我创建了一个 String 对象并将其传递给如下所示的函数:

Java 函数声明:

interface foo extends Library
{
 ....//loading dll and other work
  int xxfunction(String chararray);//function declaration
}

Java 函数调用:

public static void main(String args[]) 
{
 String str="abcd";
 int i=fooinstance.xxfunction(str);//function call
}

但是当我执行这段代码时,它给了我:

Java 运行时环境检测到一个致命错误: 无法写入核心转储。默认情况下不启用小型转储 Windows 的客户端版本

崩溃发生在 Java 虚拟机之外的本地代码中。请参阅有问题的框架以了解报告错误的位置。

那么在函数需要 char 指针的地方将 String 作为参数传递是正确的方法吗? java中的C++ char等价物是byte,所以需要传递byte数组作为参数吗?

我什至无法将指针对象从 JNA 传递给函数,因为它给了我IllegalargumentException

【问题讨论】:

    标签: java c++ function dll jna


    【解决方案1】:

    只有const char* 应该映射到Java String。如果它不是可能是const,你应该传递一个缓冲区(byte[]Memory 或 NIO 缓冲区),然后在“返回”上使用Native.toString() "值。

    作为一种风格问题,您应该始终向被调用者提供所提供缓冲区的长度,以便它有足够的可用信息来避免覆盖缓冲区。

    【讨论】:

    • 感谢您的回复,是的 C++ 函数参数不是 'const char*' 它只是 'char*' ,所以根据您的建议,我尝试传递 'byte[]' 甚至 'Memory'也但是它给了我同样的错误更新:byte[] primitivebytearray=new byte[256];int i=fooinstance.xxfunction(primitivebytearray);String str=new String();Memory mem=new Memory(257);mem.setString(0,str);i=fooinstance.xxfunction(mem);
    • 您的本机代码正在向传入缓冲区写入超过 256-257 个字符,或者它在其他地方存在问题。检测/记录您的本机代码执行情况,或附加调试器以从源头捕获崩溃。
    • 不,它不写超过 256 个字符,我尝试将所有其他可能的数据类型也传递给该函数,但它给出了相同的错误。那么我应该在 java 中发送什么参数以使其与 C++ 中的 char* 兼容?在 JNA 中没有任何方法可以做到吗?而且我无法附加记录的文件,因为我的公司不允许访问任何共享站点
    • # Java 运行时环境检测到致命错误:# EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x03d12366, pid=5432, tid=2252 JRE version: 7.0_04-b22 # Java VM: Java HotSpot(TM) Client VM (23.0-b21 混合模式,共享 windows-x86 ) # 有问题的框架:# C [WINUSB.DLL+0x2366] WinUsb_ControlTransfer+0x4a # # 无法写入核心转储。默认情况下,在 Windows 的客户端版本上不启用 Minidumps #包含更多信息的错误报告文件保存为:# C:\Documents and Settings\mml4kor\jni_dll\JnaSample\hs_err_pid5432.log #
    • # 如果您想提交错误报告,请访问:# bugreport.sun.com/bugreport/crash.jsp # 崩溃发生在 Java 虚拟机之外的本地代码中。 # 查看有问题的框架以了解报告错误的位置。 #
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-02-21
    • 1970-01-01
    • 1970-01-01
    • 2019-10-23
    • 2010-12-15
    相关资源
    最近更新 更多