0
点赞
收藏
分享

微信扫一扫

Android JNI之静态注册

张宏涛心理 2022-03-18 阅读 76

在这里插入图片描述

Java使用JNI之前, 首先要先注册相应的库, .NI函数的注册有两种方式,一种是静态注册方式,另一种是动态注册方式。

静态注册

JAVA部分

静态注册方式比较简单, 根据函数名来建立java方法和JNI函数间的一一对应关系。

使用实例:

 static {
  System.loadLibrary(“goodluck”);
  }

库的扩展名字可以不用写出来,由系统自己判断。

此外还需要对将要调用的方法做本地声明,关键字为native, 不需要具 体实现。

使用实例:

  public native static void set(int i);
  public native static int get();

这样就可以在Java中使用JNI中的函数了.

完整的使用实例:

 public class testdll {
  static {
      System.loadLibrary("goodluck");
  }
  public native static int get();
  public native static void set(int i);
  public static void main(String[] args){
      testdll test = new testdll();
      test.set(10);
      System.out.println(test.get());
  }
 }

C++部分

当然C++部分要来完成上述的native声明函数的实现.首先在在头文件中声明函数,命名规则是JNI特有的规则:

  /* Header for class testdll */
  #ifndef _Included_testdll
  #define _Included_testdll
  #include "jni.h"
  #ifdef __cplusplus
  extern "C" {
  #endif
  JNIEXPORT jint JNICALL Java_testdll_get (JNIEnv *, jclass);
  JNIEXPORT void JNICALL Java_testdll_set (JNIEnv *, jclass, jint);
  #ifdef __cplusplus
  }
  #endif
  #endif

其中jni.h头文件包含了许多JNI编码中要用到的方法.

编写cpp文件实现函数:

  #include "testdll.h"
  int i = 0;
  JNIEXPORT jint JNICALL Java_testdll_get (JNIEnv *, jclass)
  {
        return i;
  }
  JNIEXPORT void JNICALL Java_testdll_set (JNIEnv *, jclass, jint j)
  {
      i = j;
  }

编写Android.mk将C++代码编译成goodluck.so,注意这里编译要使用NDK.

编译好之后就可以被上面的JAVA程序调用了. O(∩_∩)O~~

优缺点

静态注册的优点就是比较直观.
静态注册的缺点:

  1. 书写很不方便,因为JNI层函数的名字必须遵循特定的格式,且名字特别长;
  2. 会导致程序员的工作量很大,因为必须为所有声明了native函数的java类编写JNI头文件;
  3. 程序运行效率低,因为初次调用native函数时需要根据根据函数名在JNI层中搜索对应的本地函数,然后建立对应关系,这个过程比较耗时。

下一章继续讲解动态注册.

在这里插入图片描述

举报

相关推荐

0 条评论