Android : C++调用Java

本文介绍了在Android开发中,如何通过JNI从C++层调用Java层的代码。详细讲解了在主线程和子线程中获取JNIEnv*并调用Java方法的步骤,包括静态和非静态方法的调用。同时提到了JNI中可能出现的内存泄漏问题,并给出了资源链接。
摘要由CSDN通过智能技术生成

转载请标明出处:https://blog.csdn.net/qq_29621351/article/details/79870319

    通过这段时间接触JNI的过程,觉得JNI里面的坑还是挺多的,有的地方理解的也不是很周到,如果发现理解错的地方,请大家能够指出,我会立即改正。

JNI可以理解为三层:Java层,JNI层,C++层。

    Java层就是Java语言编写的程序,C++层是纯粹的C/C++语言,而JNI层是函数映射层类似于下面这种函数形式,这种形式的函数对应Java中的一个具体函数,如果对应Java中的具体函数是静态函数则第二个参数就和下面一样,如果是非静态函数则第二个参数换为jobject obj。

JNIEXPORT jint JNICALL someMethod(JNIEnv* env, jclass cls,...) // ...表示其它参数,而不是变长函数参数。

JNI层直接调用Java

    如果想在JNI层直接调用Java层是很方便的,JNIEnv* env这个类型的变量直接提供了调用Java函数的方式,JNIEnv的含义是Java虚拟机的执行环境,可以通过它来操纵Java层中的类方法、对象方法,而jclass表示Java中的类,JNI层映射函数传入的jclass和jobject表示该方法的类实例或对象实例,简单的调用方法如下所示:

jclass clazz = env -> FindClass("utils/LogWriter");
jmethodID mid = env -> GetStaticMethodID(clazz,"aMethod","(Ljava/lang/String;Ljava/lang/String;)V");
env -> CallStaticVoidMethod(clazz,mid, strArgs1,strArgs2);

步骤1:表示获得Java虚拟机中的类,参数"utils/LogWriter"表示Java中一个自定义的类,也可以是Java类库中的一个类,包名的使用类定义文件中开头 package 后面的路径加上"/类名"。简单地说就是跟 import 这个类所带有的参数是一样的。

步骤2:在获取Java中的一个类后,要继续得到这个类的方法,通过得到的类clazz和环境变量env、方法名aMethod来得到方法的id,类型为jmethodID,还要描述方法返回值和传入参数,本例中的描述方式以"(Ljava/lang/String;Ljava/lang/String;)V"表示,读者可自行查阅描述方式的规则。

步骤3:通过环境变量env调用Java的方法,CallStaticVoidMethod为调用静态方法的方式。strArgs1和strArgs2为Java方法传入参数,在传入之前先自己设定其值。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值