我有一个C++库xyz。它有很多类,如xyzA
,xyzB
等我想要使用类xyzA
在xyz库中的方法getAge()
。使用JNI从C++库加载特定类的方法
xyz.so
文件已存在。
步骤我都遵循:
创建一个Java类
xyz.java
class xyz { public native int getAge(); public static void main(String[] args) { new xyz().getAge(); } static { System.loadLibrary("xyz"); } }
创建的头为Java类。
/* DO NOT EDIT THIS FILE - it is machine generated */ #include <jni.h> /* Header for class xyz */ #ifndef _Included_xyz #define _Included_xyz #ifdef __cplusplus extern "C" { #endif /* * Class: xyz * Method: getAge * Signature:()I */ JNIEXPORT jint JNICALL Java_xyz_getAge (JNIEnv *, jobject); #ifdef __cplusplus } #endif #endif
CPP的包装类的样子:
#include <stdio.h> #include "xyz.h" #include <jni.h> JNIEXPORT jint JNICALL Java_xyz_getAge(JNIEnv *, jobject) { // some code }
我成功编译的类,如下所示:
gcc -fPIC -shared -l stdc++ -I/grid/0/gs/java/jdk64/current/include -I/grid/0/gs/java/jdk64/current/include/linux xyz.cpp
然后运行Java PROG为:
java -Djava.library.path=/grid/0/tmp/direct/lib xyz
我得到以下错误:
Exception in thread "main" java.lang.UnsatisfiedLinkError: xyz.getAge()I at xyz.getAge(Native Method) at xyz.main(xyz.java:6)
它无法找到特定的类xyzA
方法getAge()
。如何访问该方法?另外,图书馆是通过我的包装类来链接的吗?
任何指针,将不胜感激。
谢谢。
另一种方法是使用'System.load(String)',并提供完整的路径和文件名。但是,遵守共享库命名的平台惯例仍然是一个好主意。 –
'strace'可以方便地找出jvm试图加载的内容。 – msandiford