使用JNA将const char **映射到Java类型
我正在尝试使用Java中的C ++库和JNA。 在库的头文件中,我有以下方法声明:
extern "C" void foo(const char** bar);
paramterer bar
应该传递给foo
空,并且foo
vill为它分配一个我想在Java中进行检索的值。 应该如何设置相应的Java方法声明(例如,我应该将哪种Java类型映射到),以及如何使用它?
我尝试了以下Java声明:
void foo(String bar); void foo(String[] bar); void foo(Pointer bar);
当我调用foo
时,它们都会导致以下错误:
线程“main”中的exceptionjava.lang.Error:无效的内存访问
在下面找到一个小片段。
libfoo.cpp
#include extern "C" void foo(const char** bar); void foo(const char** bar) { for (int i = 0; bar[i] != '\0'; i++) { fprintf(stdout, "%s\n", 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