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();
}
C调用java中参数为string的方法
C部分代码:
/**
* 调用Java中的JNI类的PrintString方法
*/JNIEXPORT void JNICALL Java_com_atguigu_callbackjavamethod_JNI_callbackPrintString(
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,"printString","(Ljava/lang/String;)V");
//3.得JNI的对象,设执行方法的对象jobject (*AllocObject)(JNIEnv*, jclass);
jobject cObject= (*env)->AllocObject(env,clazz);
//4.执行方法 jint (*CallIntMethod)(JNIEnv*, jobject, jmethodID, ...);
//java String 和 C中的jstring;
//创建jstring:jstring (*NewStringUTF)(JNIEnv*, const char*);
char* text = " I am from C Data !!!";
jstring cString =(*env)->NewStringUTF(env,text);
(*env)->CallVoidMethod(env,cObject,methodID,cString);//C代码调用Java中JNI类的printString
}
Java代码调用
public void click3(View view){
JNI jni = new JNI();
jni.callbackPrintString();
}
本教程由尚硅谷教育大数据研究院出品,如需转载请注明来源。