Load JNI *.so
JNI 相关实现lib,需要显示加载。
Loading Explicitly
def main(args: Array[String]): Unit = {
val unixsocket = if (args.length > 0) args(0) else "/tmp/plasmaStore"
System.loadLibrary("plasma_java")
val plasmaClient = new plasma.PlasmaClient(unixsocket, "", 0)
java.library.path
System.loadLibrary("plasma_java")
System.loadLibrary 会在 java.library.path 路径下找,也会在linux 下 LD_LIBRARY_PATH路径下找,
所以有特别的路径,可以通过 -Djava.library.path 进行set
java -cp plasma-client-driver-1.0-SNAPSHOT-jar-with-dependencies.jar -Djava.library.path=/opt/home/conda/envs/oap-0.9.0/lib/ com.zhixing.PlasmaClient
def main(args: Array[String]) {
println("Hello World!")
println("java.library.path: " + System.getProperty("java.library.path"))
}
#result
Hello World!
java.library.path: /usr/java/packages/lib/amd64:/usr/lib64:/lib64:/lib:/usr/lib
GetMethodID
jmethodID GetMethodID(jclass clazz, const char *name, const char *sig);
public class NativeSerializableObject {
public int[] size;
public long[] memoryAddress;
/**
* Create an instance for NativeSerializableObject.
*
* @param memoryAddress native ArrowBuf data addr.
* @param size ArrowBuf size.
*/
public NativeSerializableObject(long[] memoryAddress, int[] size) {
this.memoryAddress = memoryAddress;
this.size = size;
}
}
“([J[I)V” 对应的是NativeSerializableObject
static jclass serializable_obj_builder_class;
static jmethodID serializable_obj_builder_constructor;
serializable_obj_builder_class = CreateGlobalClassReference(
env, "Lcom/intel/oap/vectorized/NativeSerializableObject;");
serializable_obj_builder_constructor =
GetMethodID(env, serializable_obj_builder_class, "<init>", "([J[I)V");
return env->NewObject(serializable_obj_builder_class,
serializable_obj_builder_constructor, memory_addrs, sizes);
获取构造方法
jni获取构造方法,必须用<init>
// 构造函数一
jmethodID init = env->GetMethodID(dogClass, "<init>", "()V");
jobject dog = env->NewObject(dogClass, init);
// 构造函数2
init = env->GetMethodID(dogClass, "<init>", "(I)V");
dog = env->NewObject(dogClass, init, 100);
错误汇总
case1
Caused by: java.lang.IllegalAccessException: Unable to find method <init> within signature(J[J[JJ)V
at java.lang.ClassLoader$NativeLibrary.load(Native Method)
at java.lang.ClassLoader.loadLibrary0(ClassLoader.java:1941)
at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1824)
at java.lang.Runtime.load0(Runtime.java:809)
at java.lang.System.load(System.java:1086)
at com.intel.oap.vectorized.JniUtils.loadLibraryFromJar(JniUtils.java:138)
at com.intel.oap.vectorized.JniUtils.<init>(JniUtils.java:82)
at com.intel.oap.vectorized.JniUtils.getInstance(JniUtils.java:62)
解决方案
类构造函数参数类型换了。然而GetMethodID中的signature(J[J[JJ)V 没有修改