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