使用 JNA 将 const char** 映射到 Java 类型
Mapping const char** to Java type with JNA
我正在尝试将 Java 中的 C++ 库与 JNA 一起使用。在库的头文件中,我有以下方法声明:
extern "C" void foo(const char** bar);
参数 bar
应该传递给 foo
空的,并且 foo
将为它分配一个我想在 Java 中检索的值。对应的Java方法声明应该如何设置(比如Java应该映射bar
到什么类型),如何使用?
我尝试了以下 Java 声明:
void foo(String bar);
void foo(String[] bar);
void foo(Pointer bar);
当我调用 foo
时,它们都会导致以下错误:
Exception in thread "main" java.lang.Error: Invalid memory access
在下面找到一个小片段。
libfoo.cpp
#include <stdio.h>
extern "C" void foo(const char** bar);
void foo(const char** bar) {
for (int i = 0; bar[i] != '[=10=]'; 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
我正在尝试将 Java 中的 C++ 库与 JNA 一起使用。在库的头文件中,我有以下方法声明:
extern "C" void foo(const char** bar);
参数 bar
应该传递给 foo
空的,并且 foo
将为它分配一个我想在 Java 中检索的值。对应的Java方法声明应该如何设置(比如Java应该映射bar
到什么类型),如何使用?
我尝试了以下 Java 声明:
void foo(String bar);
void foo(String[] bar);
void foo(Pointer bar);
当我调用 foo
时,它们都会导致以下错误:
Exception in thread "main" java.lang.Error: Invalid memory access
在下面找到一个小片段。
libfoo.cpp
#include <stdio.h>
extern "C" void foo(const char** bar);
void foo(const char** bar) {
for (int i = 0; bar[i] != '[=10=]'; 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