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


上一篇:
下一篇:
关于尚硅谷
教育理念
名师团队
学员心声
资源下载
视频下载
资料下载
工具下载
加入我们
招聘岗位
岗位介绍
招贤纳师
联系我们
电话:010-56253825
邮箱:info@atguigu.com
地址:北京市昌平区宏福科技园综合楼6层(北京校区)

 深圳市宝安区西部硅谷大厦B座C区一层(深圳校区)

上海市松江区谷阳北路166号大江商厦6层(上海校区)