Android JNI调用的二种方式



Android JNI调用的二种方式

首先创建一个专门用于JNI调用的单例MainNative,并且在里面添加静态块加载so库。

publicclass MainNative {

         private static MainNative instance =new MainNative(); 

    private MainNative (){} 

    public static MainNative getInstance(){ 

             returninstance;  

    } 

         static {

                   //加载libMyApp.so

                   System.loadLibrary("MyApp");

         }

}

  1. 固定函数名映射方式

    首先在java代码中添加方法

    public native void Test();

    然后在对应的cpp文件中创建方法

    注意定义的方法名格式必须为 Java_ +包名 + 类名+方法名

    : Java_ + com_MyApp_myapp_+ ainNative_ + Test

    Java_com_MyApp_myapp_MainNative_Test

    因为避免C++的函数名替换导致接口名变化必须将方法名定义为c函数

extern "C"

{

voidJava_com_MyApp_myapp_MainNative_Test(JNIEnv *env,jobject obj)

{

           LOGI("TestLogi");

}

}

这样就可以直接通过调用MainNative类的native方法Test调用C++的方法Java_com_MyApp_myapp_MainNative_Test了。

  1. 注册函数映射表方式

    cpp中添加jni.h;

typedef struct {

const char* name;  //java中的方法名的字符串

const char* signature; //描述函数的参数和返回值的字符串

void*      fnPtr;  //C/C++的函数指针

} JNINativeMethod

此结构体就是javaC++函数的映射结构。

先定义一个JNINativeMethod的结构体数组,里面包含JAVAC/c++的函数映射。

然后在cpp添加JNI_OnLoad函数,JNI_OnLoad.so被加载的时候就会被调用。

jintJNI_OnLoad(JavaVM* vm, void* reserved);

注册映射调用env->RegisterNatives函数

jint RegisterNatives(jclass clazz, const JNINativeMethod* methods,

        jint nMethods)

第一个参数是要注册的类,由findclass获取出来

jclass FindClass(const char* name);//name为完整的类路径

如:"com/MyApp/myapp/MainNative"

第二个参数就是上面说的函数映射结构体。

第三个参数是这个结构体的数目。

 

通过这个函数调用成功就可以达到双方函数的额映射了。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值