Android 下 JNI 开发
3.用Java代码反射回顾
public class Utils {
public int add(int x,int y){
return x+y;
}
}
public class Demo {
public static void main(String[] args) {
//使用反射调用
//1.首先得到字节码
Class clazz = Utils.class;
//2.得到方法
Method method = null;
try {
method=clazz.getDeclaredMethod("add", int.class,int.class);
//3.Utils实例对象
Object obj = clazz.newInstance();
//4.执行方法
int result = (Integer) method.invoke(obj, 199,1);
System.out.println("result="+result);
} catch (Exception e) {
e.printStackTrace();
}
}
}
4.C调用java空方法-C语言中具体实现
/**
* 回调Java中JNI类中的HelloFromJava方法
*/
JNIEXPORT void JNICALL Java_com_atguigu_callbackjavamethod_JNI_callbackHelloFromJava(
JNIEnv *env, jobject obj) {
//用反射
//1.首先得到字节码 jclass (*FindClass)(JNIEnv*, const char*);第一个参数是要反射类的那个类的完整名称;但是需要把.改成/
jclass clazz = (*env)->FindClass(env,"com/atguigu/callbackjavamethod/JNI");
//2.得到方法jmethodID (*GetMethodID)(JNIEnv*, jclass, const char*, const char*);
//倒数第二个方法:要回调的方法名;最后一个参数是方法签名
jmethodID methodID = (*env)->GetMethodID(env,clazz,"helloFromJava","()V");
//3.Utils实例对象jobject (*AllocObject)(JNIEnv*, jclass);
jobject object =(*env)->AllocObject(env,clazz);
//4.执行方法
//void (*CallVoidMethod)(JNIEnv*, jobject, jmethodID, ...);
(*env)->CallVoidMethod(env,object,methodID);//调用Java中的JNI中的HelloFromJava()方法了
}
方法签名命令(javap -s ):
D:\jni_workspace\CallbackJavaMethod\bin\classes>javap -s com.atguigu.callbackjav
amethod.JNI
Java代码MainActivity点击事件使用
public void click1(View view){
JNI jni = new JNI();
jni.callbackHelloFromJava();
}
Java中JNI.java代码中的native方法和被调方法helloFromJava
// C调用java空方法
public void helloFromJava() {
System.out.println("helloFromJava()");
}
/**
* 调用C语言代码,C代码回调helloFromJava方法
*/
public native void callbackHelloFromJava();
5.C调用java中的带两个int参数的方法-C语言的代码如下
/**
* C回调Java中JNI.java中的add方法
*/JNIEXPORT void JNICALL Java_com_atguigu_callbackjavamethod_JNI_callbackAdd(
JNIEnv *env, jobject obj) {
//用反射
//1.首先得到字节码 jclass (*FindClass)(JNIEnv*, const char*);第一个参数是要反射类的那个类的完整名称;但是需要把.改成/
jclass clazz = (*env)->FindClass(env,"com/atguigu/callbackjavamethod/JNI");
//2.得到方法jmethodID (*GetMethodID)(JNIEnv*, jclass, const char*, const char*);
//倒数第二个方法:要回调的方法名;最后一个参数是方法签名
jmethodID methodID = (*env)->GetMethodID(env,clazz,"add","(II)I");
//3.Utils实例对象jobject (*AllocObject)(JNIEnv*, jclass);
jobject cObj = (*env)->AllocObject(env,clazz);
//4.执行方法
// jint (*CallIntMethod)(JNIEnv*, jobject, jmethodID, ...);
int x = 10;
int y = 20;
int cInt= (*env)->CallIntMethod(env,cObj,methodID,x,y);//调用了Java中JNI.java中的add()方法
LOGE("cInt==%d",cInt);//C语言得到了结果
}
Java调用
public void click2(View view){
JNI jni = new JNI();
jni.callbackAdd();
}
本教程由尚硅谷教育大数据研究院出品,如需转载请注明来源,欢迎大家关注尚硅谷公众号(atguigu)了解更多。