我正在尝试使用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.Error:无效的内存访问
答案 0 :(得分:1)
在下面找一个小片段。
<强> libfoo.cpp 强>
#include <stdio.h>
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