JNI的调用与编写

        jni的调用

            1)加载动态库, static用于优先执行, 

         static{

         // 加载jni动态库的时候会执行so中的JNI_OnLoad()

         System.loadLibrary("led_jni");  // /system/lib/libled_jni.so

         }

        2)声明本地方法

         public native int opeDev();

         public native int devOn();

         public native int devOff();

         public native int closeDev();

        

        3) 调用本地方法:

         opeDev();

   

     jni的编写:

        1)实现一个接口:

            jint JNI_OnLoad(JavaVM* vm, void* reserved)

        

          1, 获取dvm中环境变量对象,并且测试jni的版本是否为1.4

         env对象能提供各种方法,去操作java中代码: 属性和方法

         vm->GetEnv(void * * env,jint version)

        

         参数1: 环境变量对象

         JNIEnv 包括了操作整个jni空间的各种方法

         参数2: 需要被测试版本

         返回值: 正常: 0

         错误: 负数

          使用:

         JNIEnv *env = NULL;

         jint ret = vm->GetEnv( (void **)&env, JNI_VERSION_1_4);

         if(ret != 0)

         {

         xxx

         }

         2) 注册映射表

         typedef struct { 

         const char*name;   // java方法名

         const char*signature;   // 方法的描述

         void*fnPtr;   //  c/c++的函数名

         } JNINativeMethod;

        

         JNINativeMethod  myMethods[] = {

         {"openDev",  "()I",    (void *)open_led},

         {"devOn",  "()I",    (void *)led_on},

         {"devOff",  "()I",    (void *)led_off},

         {"closeDev",  "()I",    (void *)close_led},

         };

        

         // 获取java中native方法所在的包.类

          jclass  cls= env->FindClass("com/example/ledjnitest/LedActivity");

         env->RegisterNatives(jclass clazz,const JNINativeMethod * methods,jint nMethods)

         参数1: jclass clazz, 描述java中本地方法所在的类

         env->FindClass(char *name);

         ==>

         jclass mycls = env->FindClass("com/hq/ledjnitest/MainActivity");

         参数2: 映射表对象

         参数3: 映射表中的项目数



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值