【Android JNI 开发入门指南】

时间:2025-05-13 08:06:15
#include <> #include <> #include <android/> #define LOG_TAG "" #define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG, LOG_TAG, __VA_ARGS__) JNIEXPORT void JNICALL Java_com_itheima_callbackjava_JNI_callbackvoidmethod (JNIEnv * env, jobject clazz){ //C函数 通过反射调用java中的方法 //[1]:首先获取需要被反射回调的方法所在的类的字节码对象 //jclass (*FindClass)(JNIEnv*, const char*); jclass claz = (*env)->FindClass(env,"com/itheima/callbackjava/JNI"); //[2]:获取需要被反射回调的方法的 methodId //jmethodID (*GetMethodID)(JNIEnv*, jclass, const char*, const char*); jmethodID methodID =(*env)->GetMethodID(env,claz,"helloFromJava","()V"); //[3]:通过字节码对象创建一个Object //由于本例中,需要被回到的方法与native方法位于同一个类中,因此可以直接使用本地函数的参数 clazz 。 //[4]:通过对象调用方法 //void (*CallVoidMethod)(JNIEnv*, jobject, jmethodID, ...); (*env)->CallVoidMethod(env,clazz,methodID); } JNIEXPORT void JNICALL Java_com_itheima_callbackjava_JNI_callbackintmethod (JNIEnv * env, jobject clazz){ jclass claz =(*env)->FindClass(env,"com/itheima/callbackjava/JNI"); jmethodID methodID = (*env)->GetMethodID(env,claz,"add","(II)I"); //jint (*CallIntMethod)(JNIEnv*, jobject, jmethodID, ...); int result =(*env)->CallIntMethod(env,clazz,methodID,3,4); LOGD("result = %d",result); } JNIEXPORT void JNICALL Java_com_itheima_callbackjava_JNI_callbackStringmethod (JNIEnv * env, jobject clazz){ jclass claz =(*env)->FindClass(env,"com/itheima/callbackjava/JNI"); jmethodID methodid =(*env)->GetMethodID(env,claz,"printString","(Ljava/lang/String;)V"); jstring result =(*env)->NewStringUTF(env,"hello from c"); (*env)->CallVoidMethod(env,clazz,methodid,result); } JNIEXPORT void JNICALL Java_com_itheima_callbackjava_JNI_callbackShowToast (JNIEnv * env, jobject clazz){ jclass claz =(*env)->FindClass(env,"com/itheima/callbackjava/JNI"); jmethodID methodid =(*env)->GetMethodID(env,claz,"showToast","(Ljava/lang/String;)V"); //如果:回调方法与native方法不再同一个类中,则需要获取回调方法所在类的对象。 //jobject (*AllocObject)(JNIEnv*, jclass); jstring result =(*env)->NewStringUTF(env,"hello from c"); //void (*CallVoidMethod)(JNIEnv*, jobject, jmethodID, ...); (*env)->CallVoidMethod(env,clazz,methodid,result); }