使用 jna 从 java 调用 c++ main 方法
invoke c++ main method from java using jna
我正在尝试在 mac/unix 环境中使用 JNA 从 java 调用 c++ 方法。
我有两个问题。
到目前为止,我可以成功实现简单的示例,但我不确定如何为以下内容编写 java 对应部分
C++ 方法:
int main(int argc, char* argv[]){...}
Java 我试过的代码
public interface CTest extends Library {
int main(int argc, Pointer argv);
}
给予
java.lang.UnsatisfiedLinkError: 查找函数时出错 'main': dlsym(0x7fdee8c39300, main): 找不到符号
也尝试了以下
public interface CTest extends Library {
int main(int argc, Object... argv[]);
//doesnt work either - int main(int argc, String argv);
}
无济于事。相同的问题 - 找不到符号。
有小费吗?
最终我需要做这样的事情:
CTest ctest = (CTest) Native.loadLibrary("ctest", CTest.class);
String obj[] = new String[]{"-v, filepath/file"};
ctest.main(2, obj);
- 第二个问题是关于在多线程环境中实现上述内容。我可能有多个图书馆位于不同的位置,所以
System.setProperty("jna.library.path",path-to-dylib)
不会工作。我怎样才能做到这一点?
好吧,我自己想出来了,希望能得到一个快速的答案,但无论如何。
这是解决方案:
Answer-1 : 下面是我的接口方法
public interface CTest extends Library {
public int main(int arc, String[] argv);
}
答案 2:这就是我计划处理多线程的方式
String argv[] = {"-v","path-to-file/file.extension"};
System.load(this.getClass().getResource("libmylib.dylib").getFile());
//load a different library later if required.. this way multiple threads load respective libs when/what they want
HelloJNA.CTest ctest = (HelloJNA.CTest) Native.loadLibrary("mylib", HelloJNA.CTest.class);
希望对您有所帮助。
我正在尝试在 mac/unix 环境中使用 JNA 从 java 调用 c++ 方法。
我有两个问题。
到目前为止,我可以成功实现简单的示例,但我不确定如何为以下内容编写 java 对应部分 C++ 方法:
int main(int argc, char* argv[]){...}
Java 我试过的代码
public interface CTest extends Library {
int main(int argc, Pointer argv);
}
给予
java.lang.UnsatisfiedLinkError: 查找函数时出错 'main': dlsym(0x7fdee8c39300, main): 找不到符号
也尝试了以下
public interface CTest extends Library {
int main(int argc, Object... argv[]);
//doesnt work either - int main(int argc, String argv);
}
无济于事。相同的问题 - 找不到符号。 有小费吗? 最终我需要做这样的事情:
CTest ctest = (CTest) Native.loadLibrary("ctest", CTest.class);
String obj[] = new String[]{"-v, filepath/file"};
ctest.main(2, obj);
- 第二个问题是关于在多线程环境中实现上述内容。我可能有多个图书馆位于不同的位置,所以
System.setProperty("jna.library.path",path-to-dylib)
不会工作。我怎样才能做到这一点?
好吧,我自己想出来了,希望能得到一个快速的答案,但无论如何。 这是解决方案:
Answer-1 : 下面是我的接口方法
public interface CTest extends Library {
public int main(int arc, String[] argv);
}
答案 2:这就是我计划处理多线程的方式
String argv[] = {"-v","path-to-file/file.extension"};
System.load(this.getClass().getResource("libmylib.dylib").getFile());
//load a different library later if required.. this way multiple threads load respective libs when/what they want
HelloJNA.CTest ctest = (HelloJNA.CTest) Native.loadLibrary("mylib", HelloJNA.CTest.class);
希望对您有所帮助。