JNI 相关

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 没有修改

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Android开发中,如果需要使用JNI(Java Native Interface)来调用C/C++代码,可以使用android.bp文件来导入JNI。 Android.bp是Android开源项目中的一种构建配置文件,用于指定Android应用程序的构建规则和依赖关系。在导入JNI时,我们需要在android.bp文件中进行相应的配置。 首先,我们需要确保在该文件目录下存在jni目录,该目录用于存放C/C++源代码和头文件。在android.bp中,我们需要使用`cc_library`规则来导入JNI相关的源代码文件和头文件。 下面是一个示例的android.bp文件的配置: ``` cc_library { name: "my_jni", srcs: [ "jni/my_jni.cc", "jni/my_jni_helper.cc" ], exported_headers: [ "jni/my_jni.h", "jni/my_jni_helper.h" ], shared_libs: [ "libmyshared" ], // 可选配置,如果需要使用预编译库 static_libs: [ "libmystatic" ], } ``` 在上述配置中,我们使用了`cc_library`规则定义了一个名为"my_jni"的库。其中,`srcs`字段指定了C/C++源代码文件的路径,`exported_headers`字段指定了头文件的路径。`shared_libs`字段表示需要链接的动态链接库。如果还需要使用预编译库,可以使用`static_libs`字段。 另外,在使用JNI前,还需要在Java代码中通过`System.loadLibrary("my_jni")`方法来加载已编译的JNI库。 以上就是在Android中使用android.bp文件导入JNI的方法。通过配置android.bp文件,我们可以有效地将C/C++代码与Java代码进行结合,实现更为强大和灵活的功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值