Android Ndk 学习笔记(目录)
public native void staticRegister();
extern "C"
JNIEXPORT void JNICALL
Java_com_cn_mynativestudy_MainActivity2_staticRegister(JNIEnv *env, jobject thiz) {
LOGI("我是静态注册的函数 Java_com_cn_mynativestudy_MainActivity2_staticRegister...");
}
public void test01(View view) {
staticRegister();
}
public native void dynamicRegister();
public native int dynamicRegister2(String valueStr);
JavaVM *jvm = nullptr;
void jni_dynamicRegister(JNIEnv *env, jobject thiz){
LOGI("我是动态注册的函数 dynamicMethod01...");
}
int jni_dynamicRegister2(JNIEnv *env, jobject thiz, jstring value_str){
char * str = const_cast<char *>(env->GetStringUTFChars(value_str, NULL));
LOGI("我是动态注册的函数 dynamicMethod01...%s",str);
env->ReleaseStringUTFChars(value_str,str);
return 100 ;
}
JNINativeMethod jniNativeMethod[] = {
{"dynamicRegister","()V",(void *)(jni_dynamicRegister)},
{"dynamicRegister2","(Ljava/lang/String;)I",(int *)(jni_dynamicRegister2)}
};
extern "C"
JNIEXPORT jint JNI_OnLoad(JavaVM * javaVm ,void *){
::jvm = javaVm ;
JNIEnv *jnienv = nullptr;
int result = javaVm->GetEnv(reinterpret_cast<void **>(&jnienv), JNI_VERSION_1_6);
if(result != JNI_OK){
return -1 ;
}
jclass main2_class = jnienv->FindClass("com/cn/mynativestudy/MainActivity2");
jnienv->RegisterNatives(main2_class,jniNativeMethod,
sizeof(jniNativeMethod)/sizeof(JNINativeMethod));
return JNI_VERSION_1_6;
}
public void test02(View view) {
dynamicRegister();
}
public void test03(View view) {
int string_valueStr = dynamicRegister2("String valueStr");
Log.i("info",string_valueStr+"");
}
public native void naitveThread();
public native void closeThread();
class MyContext{
public:
JNIEnv * jniEnv = nullptr;
jobject j_obj = nullptr;
};
void * runTask(void *pVoid){
MyContext * myContext = static_cast<MyContext *>(pVoid);
JNIEnv *jniEnv = nullptr;
jint attachResult = ::jvm->AttachCurrentThread(&jniEnv, nullptr);
if (attachResult != JNI_OK) {
return 0;
}
jclass mainActivityClass = jniEnv->GetObjectClass(myContext->j_obj);
jmethodID updateActivityUI = jniEnv->GetMethodID(mainActivityClass, "updateActivityUI", "()V");
jniEnv->CallVoidMethod(myContext->j_obj, updateActivityUI);
::jvm->DetachCurrentThread();
return nullptr;
}
extern "C"
JNIEXPORT void JNICALL
Java_com_cn_mynativestudy_MainActivity2_naitveThread(JNIEnv *env, jobject thiz) {
MyContext * myContext = new MyContext();
myContext->jniEnv = env ;
myContext->j_obj = env->NewGlobalRef(thiz);
pthread_t pid ;
pthread_create(&pid, nullptr, runTask, myContext);
pthread_join(pid, nullptr);
}
extern "C"
JNIEXPORT void JNICALL
Java_com_cn_mynativestudy_MainActivity2_closeThread(JNIEnv *env, jobject thiz) {
}
public void test04(View view) {
naitveThread();
}
public void updateActivityUI() {
if (Looper.getMainLooper() == Looper.myLooper()) {
new AlertDialog.Builder(MainActivity2.this)
.setTitle("UI")
.setMessage("updateActivityUI Activity UI ...")
.setPositiveButton("知道了", null)
.show();
} else {
Log.i("info", "updateActivityUI 所属于子线程,只能打印日志了..");
runOnUiThread(new Runnable() {
@Override
public void run() {
new AlertDialog.Builder(MainActivity2.this)
.setTitle("updateActivityUI")
.setMessage("所属于子线程,只能打印日志了..")
.setPositiveButton("知道了", null)
.show();
}
});
}
}