使用JNA将const char**映射到Java类型

Mapping const char** to Java type with JNA

本文关键字:映射 Java 类型 char JNA const 使用      更新时间:2023-10-16

我正在尝试将Java中的C++库与JNA一起使用。在库的头文件中,我有以下方法声明:

extern "C" void foo(const char** bar);

参数bar应该传递给foo为空,foo将为它分配一个我想在Java中检索的值。应该如何设置相应的Java方法声明(例如,我应该将bar映射到什么Java类型),以及如何使用它?

我尝试了以下Java声明:

void foo(String bar);
void foo(String[] bar);
void foo(Pointer bar);

当我调用foo:时,它们都会导致以下错误

线程"main"java.lang中出现异常。错误:内存访问无效

在下面找到一个小片段。

libfoo.cpp

#include <stdio.h>
extern "C" void foo(const char** bar);
void foo(const char** bar) {
    for (int i = 0; bar[i] != ''; i++) {
        fprintf(stdout, "%sn", bar[i]);
    }
}

LibFooDemo.java

import com.sun.jna.Library;
import com.sun.jna.Native;
public class LibFooDemo {
    public interface FooLibrary extends Library {
        FooLibrary INSTANCE = (FooLibrary)
                Native.loadLibrary("foo", FooLibrary.class);
        void foo(String[] format);
    }
    public static void main(String[] args) {
        String[] vals = {"foo", "bar", "foobar"};
        FooLibrary.INSTANCE.foo(vals);
    }
}

编译所有源

gcc -c -fPIC libfoo.cpp -o libfoo.o
gcc -shared -o libfoo.so  libfoo.o
javac -cp jna-4.2.1.jar LibFooDemo.java

运行Java程序

java -Djava.library.path=. -cp jna-4.2.1.jar:. LibFooDemo

输出

foo
bar
foobar