Android 下 JNI 开发
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();
}
13_C语言回调java静态方法-12
C语言调用下面静态方法.
public static void sayHello(String text) {
System.out.println("MainActivity:showText: " + text);
}
Java语言代码JNI类中
//C调用Java的静态方法
public static void hello(){
System.out.println(" static method from callback C");
}
/**
* 作用是:让C代码调用Java中代码JNI.java中的hello()静态方法
*/
public native void callbackHello();
C语言代码:
/**
* C代码调用Java中的jni类的hello方法
*/
JNIEXPORT void JNICALL Java_com_atguigu_callbackjavamethod_JNI_callbackHello
(JNIEnv *env, jobject obj){
//1.得到类的字节码
jclass clazz= (*env)->FindClass(env,"com/atguigu/callbackjavamethod/JNI");
//2.得到对应的静态方法
// jmethodID (*GetStaticMethodID)(JNIEnv*, jclass, const char*, const char*);
jmethodID methodID = (*env)->GetStaticMethodID(env,clazz,"hello","()V");
//3.执行方法 void (*CallStaticVoidMethod)(JNIEnv*, jclass, jmethodID, ...);
(*env)->CallStaticVoidMethod(env,clazz,methodID);
}
本教程由尚硅谷教育大数据研究院出品,如需转载请注明来源,欢迎大家关注尚硅谷公众号(atguigu)了解更多。