为了账号安全,请及时绑定邮箱和手机立即绑定

将结构从java回调返回到c++

将结构从java回调返回到c++

慕神8447489 2021-10-13 15:47:44
在我的软件应用程序中,我使用 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 会自动同步结构,但在从回调返回结构时可能会出现错误。


查看完整回答
反对 回复 2021-10-13
  • 1 回答
  • 0 关注
  • 182 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信