jni如何调用java层代码?

Android开发中调用一个类中没有公开的方法,可以进行反射调用,而JNI开发中C调用java的方法也是反射调用。

C代码回调Java方法步骤:

①获取字节码对象(jclass (FindClass)(JNIEnv, const char*);)

②通过字节码对象找到方法对象(jmethodID (GetMethodID)(JNIEnv, jclass, const char, const char);)

③通过字节码文件创建一个object对象(该方法可选,方法中已经传递一个object,如果需要调用的方法与本地方法不在同一个文件夹则需要新创建object(jobject (AllocObject)(JNIEnv, jclass);),如果需要反射调用的java方法与本地方法不在同一个类中,需要创建该方法,但是如果是这样,并且需要跟新UI操作,例如打印一个Toast 会报空指针异常,因为这时候调用的方法只是一个方法,没有actiivty的生命周期。

④通过对象调用方法,可以调用空参数方法,也可以调用有参数方法,并且将参数通过调用的方法传入(void (CallVoidMethod)(JNIEnv, jobject, jmethodID, ...);)

/**
 调用java中Int方法   
 */
JNIEXPORT void JNICALLJava_com_mao_ccalljava_JNI_callbackIntmethod(JNIEnv *env, jobject object) {    
 jclass clzz=(*env)->FindClass(env,"com/mao/ccalljava/JNI");   
 jmethodID methodID=(*env)->GetMethodID(env,clzz,"add","(II)I");    
int result=(*env)->CallIntMethod(env,object,methodID,3,4);   
 //logcat 打印相加返回的结果   
 LOGD("RESLUT = %d",result);
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

sun cat

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值