Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用JNA将const char**映射到Java类型 我尝试在java中使用C++的JNA库。在库的头文件中,我有以下方法声明: extern "C" void foo(const char** bar);_Java_C++_Jna - Fatal编程技术网

使用JNA将const char**映射到Java类型 我尝试在java中使用C++的JNA库。在库的头文件中,我有以下方法声明: extern "C" void foo(const char** bar);

使用JNA将const char**映射到Java类型 我尝试在java中使用C++的JNA库。在库的头文件中,我有以下方法声明: extern "C" void foo(const char** bar);,java,c++,jna,Java,C++,Jna,参数bar应该传递给fooempty,并且foovill将给它分配一个我想用Java检索的值。应该如何设置相应的Java方法声明(例如,我应该将bar映射到什么Java类型),以及如何使用它 我尝试了以下Java声明: void foo(String bar); void foo(String[] bar); void foo(Pointer bar); 当我调用foo时,它们都会导致以下错误: 线程“main”java.lang中出现异常。错误:内存访问无效 在下面找到一个小片段 libfo

参数
bar
应该传递给
foo
empty,并且
foo
vill将给它分配一个我想用Java检索的值。应该如何设置相应的Java方法声明(例如,我应该将
bar
映射到什么Java类型),以及如何使用它

我尝试了以下Java声明:

void foo(String bar);
void foo(String[] bar);
void foo(Pointer bar);
当我调用
foo
时,它们都会导致以下错误:

线程“main”java.lang中出现异常。错误:内存访问无效


在下面找到一个小片段

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]);
    }
}
编译所有源代码

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

遵循Javadoc
字符串[]
。如果您获得了源代码,您将在
/www
中获得最新文档。链接文档建议
String[]
使用
char**
。这是
const char**
有什么区别吗?使用
String[]
会给我问题中提到的错误。@在测试了更多的错误后,结果发现使用
String[]
有效-我只是因为一个不相关的错误而无法让它工作。如果你想根据你的评论写一个答案,请随意写。否则我会写一个自我回答。谢谢。我用一个简短的例子补充一个答案。
foo
bar
foobar