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();

}

 

JavaJNI.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)了解更多。