王桑的一天 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日

悬赏问题

  • ¥20 机器学习能否像多层线性模型一样处理嵌套数据
  • ¥20 西门子S7-Graph,S7-300,梯形图
  • ¥50 用易语言http 访问不了网页
  • ¥50 safari浏览器fetch提交数据后数据丢失问题
  • ¥15 matlab不知道怎么改,求解答!!
  • ¥15 永磁直线电机的电流环pi调不出来
  • ¥15 用stata实现聚类的代码
  • ¥15 请问paddlehub能支持移动端开发吗?在Android studio上该如何部署?
  • ¥20 docker里部署springboot项目,访问不到扬声器
  • ¥15 netty整合springboot之后自动重连失效