Android JNI开发中JAVA调用C/C++层 的两种方法------传统方法和RegisterNatives

 

有两种方式传统方式和RegisterNatives方式。其中第二种效率更高也更灵活。

一、传统方法

1在java类中生命native方法,如下图所示

   

 

2 .在android studio的终端使用利用javah命令生成上面Java类所对应的头文件xxx_JniTest.h

javah 命令如下

执行完命令后可以看到生成的头文件,如下

 

3 在src目录下建立jni文件夹,并将生成的头文件拷贝到文件夹下。在该文件夹下,实现包含头文件,实现native接口

 

4、生成so文件,参考https://blog.csdn.net/guo984298820/article/details/73604796

5、在java中加载so库

二、使用RegisterNatives方法调用C代码层

1、java类中定义接口,同第一种方法一样。

2、在c文件中实现改接口,名字可以和java中定义的不一样。

3、使用 JNINativeMethod使注册接口。

 

JNINativeMethod定义如下

typedef struct {

   char *name;

   char *signature;

   void *fnPtr;

} JNINativeMethod;

name是java中定义的native函数的名字,fnPtr是函数指针,也就是C++中java native函数的实现。signature是java native函数的签名

 

4、注册接口的调用要在JNI_OnLoad函数中,JNI_OnLoad的调用时机是:

Android的 VM(VirtualMachine)执行到C组件(即*so文件)里的System.loadLibrary()函数时,首先会去执行C组件里的JNI_OnLoad()函数。

5、生成so库,参照上面第一种方法第4条。

6、加载so库,参照第一种方法第5条。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值