使用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