【Android JNI 开发入门指南】
#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);
}