使用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方法声明(例如,我应该将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] != ' '; i++) {
fprintf(stdout, "%sn", 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
相关文章:
- 将C++映射转换为 Java 映射
- 如何在 JniWrapper 中将 Java ArrayList<float[]> 映射到C++ Vector<array<float,size>>?
- C++从 Java 角度设置和映射内存管理
- 将 JNI -> jobject(基本上是 java 文件中的映射和/或映射的映射)转换为 std::map(c++)
- 如何使用 JavaCpp 将函数调用从 c++ 映射到 Java?
- 从 Java 调用C++函数。映射"const char*"
- 将C++内存排序映射到Java
- 如何使用JNA将返回字符串数组(constchar**)的函数映射到Java
- 您将如何为 std::list<std::string> 创建一个类型映射,以在<String> List in C++ 中为 Java 在 SWIG 中创建?
- Java JNA映射中的VirtualAllocEx函数
- 使用JNA将const char**映射到Java类型
- Java 编程语言中的数据类型如何映射到本机编程语言(如 C 和 C++)中的数据类型
- java库类似于c++映射
- c++映射和Java入口
- 使用SWIG对java进行类型映射异常,仍然没有被捕获
- 如何使用 swig 类型映射将 std::vector<std::p air<std::string, int> > 从 java 返回到 c++
- 这个java映射代码的c ++版本是什么
- Java中读取的C++中的内存映射文件
- 为什么C++ STL 映射是慢速 Java 的映射类?
- java socket.read to b[] 忽略从 JNI 映射的区域