王桑的一天 2023-02-09 18:02 采纳率: 75%
浏览 38
已结题

JNI 如何传递 C 结构体(连续内存) 给 dll的函数

我通过JNI 调用 dll 文件。
我知道通过JNI 可以让 c/c++直接访问java数据,但有些 dll 的接口需要传递结构体指针,比如:

typdef struct Student {
    char name[32];
    int age;
} Student;

void add_student(Student* stu);

我知道用JNI 将这个dll 包装一下,在封装库内的函数中,创建一个临时 Student 对象,再将Java数据复制过去,然后用这个临时对象地址调用 dll 接口 add_student(Student* stu)。大概这样:

    Student stu;
    strcpy(stu.name, xxx);
    stu.age = xxxx;
    add_student(&stu);

但这样就多了一步复制数据的操作。
如何能在 Java 代码中就创建 Student 这个对象(或者说内存),在JNI 的封装里,就可以直接获取地址,调用函数 add_student() ,直接操作这个对象,省去了数据复制的动作。
比如在Python 中可以用ctyps 直接创建结构体对象,可以直接传递给 dll 使用

from ctypes import *

class Student(Structure):  
    _fields_ = [
        ("name", (c_char*32)),
        ("age", c_int),
    ]

stu = Student()  // 创建一个结构体,内存结构与c中一样
dll = CDLL("mydll.dll")
dll.add_student(byref(stu)) # 可直接传地址给 c 函数使用

Java中要怎么样做呢?

  • 写回答

2条回答 默认 最新

  • 王桑的一天 2023-02-17 14:15
    关注

    解决了,使用 Native.malloc() 开辟内存,把返回的地址传给函数即可。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 2月25日
  • 已采纳回答 2月17日
  • 修改了问题 2月9日
  • 创建了问题 2月9日

悬赏问题

  • ¥15 各位请问平行检验趋势图这样要怎么调整?说标准差差异太大了
  • ¥15 delphi webbrowser组件网页下拉菜单自动选择问题
  • ¥15 wpf界面一直接收PLC给过来的信号,导致UI界面操作起来会卡顿
  • ¥15 init i2c:2 freq:100000[MAIXPY]: find ov2640[MAIXPY]: find ov sensor是main文件哪里有问题吗
  • ¥15 运动想象脑电信号数据集.vhdr
  • ¥15 三因素重复测量数据R语句编写,不存在交互作用
  • ¥15 微信会员卡等级和折扣规则
  • ¥15 微信公众平台自制会员卡可以通过收款码收款码收款进行自动积分吗
  • ¥15 随身WiFi网络灯亮但是没有网络,如何解决?
  • ¥15 gdf格式的脑电数据如何处理matlab