public class My { static { System.loadLibrary("logFromC"); } public native void logFromC(); public void showToast(String message){ Toast.makeText(MyApplication.getContext(), message, Toast.LENGTH_SHORT).show(); } }
C语言源码
#include <jni.h> #include <android/log.h> #define LOG "Bouquet"// 这个是自定义的LOG的标识 #define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG,LOG,__VA_ARGS__) // 定义LOGD类型 #define LOGI(...) __android_log_print(ANDROID_LOG_INFO,LOG,__VA_ARGS__) // 定义LOGI类型 #define LOGW(...) __android_log_print(ANDROID_LOG_WARN,LOG,__VA_ARGS__) // 定义LOGW类型 #define LOGE(...) __android_log_print(ANDROID_LOG_ERROR,LOG,__VA_ARGS__) // 定义LOGE类型 #define LOGF(...) __android_log_print(ANDROID_LOG_FATAL,LOG,__VA_ARGS__) // 定义LOGF类型 JNIEXPORT void JNICALL Java_com_example_logtwo_My_logFromC (JNIEnv * env, jclass obj){ LOGD("hello I come"); // jclass (*FindClass)(JNIEnv*, const char*);//这个方法用于得到class文件 // jmethodID (*GetMethodID)(JNIEnv*, jclass, const char*, const char*);//得到方法 //jstring (*NewStringUTF)(JNIEnv*, const char*);//该方法用于将c语言的字符串转换为java的字符串 jclass clazz = (*env)->FindClass(env, "com/example/logtwo/My"); jmethodID method = (*env)->GetMethodID(env, clazz, "showToast", "(Ljava/lang/String;)V"); //void (*CallVoidMethod)(JNIEnv*, jobject, jmethodID, ...); (*env)->CallVoidMethod(env, obj,method, (*env)->NewStringUTF(env, "ahahaha")); };