使用JNA将const char **映射到Java类型

时间:2016-04-04 13:50:02

标签: java c++ jna

我正在尝试使用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:无效的内存访问

1 个答案:

答案 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