c 回调java_Android C代码回调java方法

本文详细介绍了如何从C代码回调Java方法,包括回调空方法、int类型参数方法和String类型参数方法。通过查找字节码对象、获取MethodID、创建Java对象(如果需要)以及调用方法来实现回调。
摘要由CSDN通过智能技术生成

本文将讲述下列三种C代码回调java方法

1、c代码回调java空方法

2、c代码回调java int类型参数方法

3、c代码回调javaString类型参数方法

方法都差不多,先看c代码回调java空方法,其他两种类似:

① 找到字节码对象

//jclass (*FindClass)(JNIEnv*, const char*);

//第二个参数 要回调的java方法所在的类的路径 "com/itheima/callbackjava/JNI"

② 通过字节码对象找到方法对象

//jmethodID (*GetMethodID)(JNIEnv*, jclass, const char*, const char*);

第二个参数 字节码对象 第三个参数 要反射调用的java方法名 第四个参数 要反射调用的java方法签名

javap -s 要获取方法签名的类的全类名 项目/bin/classes 运行javap

6235ac9117e58e12ffe5053559e9acce.png

③ 通过字节码创建 java对象(可选) 如果本地方法和要回调的java方法在同一个类里可以直接用 jni传过来的java对象 调用创建的Method

jobject obj =(*env)->AllocObject(env,claz);

当回调的方法跟本地方法不在一个类里 需要通过刚创建的字节码对象手动创建一个java对象

再通过这个对象来回调java的方法

需要注意的是 如果创建的是一个activity对象 回调的方法还包含上下文 这个方法行不通!!!回报空指针异常

④ 反射调用java方法

//void (*CallVoidMethod)(JNIEnv*, jobject, jmethodID, ...);

第二个参数 调用java方法的对象 第三个参数 要调用的jmethodID对象 可选的参数 调用方法时接收的参数

接下来实战项目实现

新建项目,布局如下:

新建JNI.java

packagecom.wuyudong.callbackjava;public classJNI {static{

System.loadLibrary("callback");

}public native voidcallbackvoidmethod();public native voidcallbackintmethod();public native voidcallbackStringmethod();//C调用java空方法

public voidhelloFromJava() {

System.out.println("hello from java");

}//C调用Java中的带两个int参数的方法

public int add(int x, inty) {return x +y;

}//C调用java中参数为String的方法

public voidprintString(String s) {

System.out.println(s);

}

}

MainActivity.java

packagecom.wuyudong.callbackjava;importandroid.os.Bundle;importandroid.app.Activity;importandroid.view.Menu;importandroid.view.View;public class MainActivity extendsActivity {

JNI jni;

@Overrideprotected voidonCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

jni= newJNI();

}public voidcallbackvoid(View v) {

jni.callbackvoidmethod();

}public voidcallbackint(View v) {

jni.callbackintmethod();

}public voidcallbackString(View v) {

jni.callbackStringmethod();

}

}

callback.c

#include #include

#define LOG_TAG "System.out"

#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG, LOG_TAG, __VA_ARGS__)

#define LOGI(...) __android_log_print(ANDROID_LOG_INFO, LOG_TAG, __VA_ARGS__)JNIEXPORTvoidJNICALL Java_com_wuyudong_callbackjava_JNI_callbackvoidmethod(

JNIEnv*env, jobject clazz) {//1、获取字节码对象 jclass (*FindClass)(JNIEnv*, const char*);

jclass claz = (*env)->FindClass(env, "com/wuyudong/callbackjava/JNI");//2、获取Method对象 jmethodID (*GetMethodID)(JNIEnv*, jclass, const char*, const char*);

jmethodID methodID = (*env)->GetMethodID(env, claz, "helloFromJava", "()V");//3、通过字节码对象创建一个Object(即是clazz)//4、通过对象调用方法

(*env)->CallVoidMethod(env, clazz, methodID);

}

JNIEXPORTvoidJNICALL Java_com_wuyudong_callbackjava_JNI_callbackintmethod(

JNIEnv*env, jobject clazz) {//1、获取字节码对象 jclass (*FindClass)(JNIEnv*, const char*);

jclass claz = (*env)->FindClass(env, "com/wuyudong/callbackjava/JNI");//2、获取Method对象 jmethodID (*GetMethodID)(JNIEnv*, jclass, const char*, const char*);

jmethodID methodID = (*env)->GetMethodID(env, claz, "add", "(II)I");//3、通过字节码对象创建一个Object(即是clazz)//4、通过对象调用方法

int result = (*env)->CallIntMethod(env, clazz, methodID, 3, 5);

LOGD("result = %d", result);

}

JNIEXPORTvoidJNICALL Java_com_wuyudong_callbackjava_JNI_callbackStringmethod(

JNIEnv*env, jobject clazz) {//1、获取字节码对象 jclass (*FindClass)(JNIEnv*, const char*);

jclass claz = (*env)->FindClass(env, "com/wuyudong/callbackjava/JNI");//2、获取Method对象 jmethodID (*GetMethodID)(JNIEnv*, jclass, const char*, const char*);

jmethodID methodID = (*env)->GetMethodID(env, claz, "printString","(Ljava/lang/String;)V");//3、通过字节码对象创建一个Object(即是clazz)//4、通过对象调用方法//char* str = "hello from c!";

jstring result = (*env)->NewStringUTF(env, "hello from c");

(*env)->CallVoidMethod(env, clazz, methodID, result);

}

获取更多C语言与算法相关知识,关注公众号:“csuanfa”

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值