在我的软件应用程序中,我使用 JNA 从 Java 使用 C++ 中的本机库。我需要一个回调函数,将复杂的 java 对象返回给 C++。这可能是一个简单的问题,但我没有使用 C++ 或 JNA 的经验,并且我无法成功地将 java 对象返回给 C++。我遇到的大多数 JNA 回调函数示例都很简单,要么不返回任何内容,要么返回简单的本机类型。我的本机代码如下所示typedef const char* SMC_String;int doNativeProcessing(SMC_String identifier, SMC_String lastName, SMC_String firstName)typedef struct SimpleStruct{ int myInt; SMC_String myString;} SimpleStruct;typedef SimpleStruct* (*GetSimpleStruct_Callback)(SMC_String identifier);...// function that gets called from Javaint doNativeProcessing(SMC_String identifier, SMC_String lastName, SMC_String firstName){ cout << "In native function" << endl; ...do some processing... callMyCallback(); return 0;}// function that calls the callback void callMyCallback(){ SimpleStruct *retSimpleStruct = GetSimpleStruct_Callback("id"); cout << "returned int: " << retSimpleStruct->myInt << endl; cout << "returned string: " << retSimpleStruct->myString << endl;}爪哇代码:public class SimpleStruct extends Structure { public static class ByReference extends SimpleStruct implements Structure.ByReference {} public SimpleStruct() { super(); } @Override protected List<String> getFieldOrder() { return Arrays.asList("myInt", "myString"); } public int myInt; public String myString;}...public class GetSimpleStructCB implements Callback { public SimpleStruct.ByReference callback(final String requestId) { System.out.println("In Java callback"); final SimpleStruct.ByReference retVal = new SimpleStruct.ByReference(); retVal.myInt = 25; retVal.myString = "Hello World!"; return retVal; }}public static void main(String[] args) { nativeLibrary = (NativeLibrary) Native.loadLibrary("my_native_dll", NativeLibrary.class); nativeLibrary.doNativeProcessing("id", "Doe", "John");}当我运行应用程序时,输出是In native functionIn Java callbackreturned int: 0 returned string: <blank value> 而不是预期的In native functionIn Java callbackreturned int: 25 returned string: Hello World! 你能帮我弄清楚我做错了什么吗?非常感谢您的帮助。
1 回答
慕村9548890
TA贡献1884条经验 获得超4个赞
每个 JNAStructure
分配自己的内存,一旦超出范围,它可能会被 GC 处理。
您需要让您的本机代码将内存传递给要填充的 Java 代码(而不是分配一个并返回它),或者保留对从 Java 代码返回的每 一个的强引用Structure
以防止 GC。
您也可以尝试Structure.write()
在返回之前调用;通常 Java 会自动同步结构,但在从回调返回结构时可能会出现错误。
添加回答
举报
0/150
提交
取消