- MainActivity 代码
点击按钮调用 native 方法,开启线程,调用MainActivity 方法更新UI
class MainActivity : AppCompatActivity() {
companion object {
private const val TAG: String = "MainActivity";
init {
System.loadLibrary("native-lib")
}
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
}
fun onClick(view: View) {
useThread()
}
private external fun useThread();
fun updateUI() {
if (Looper.getMainLooper() == Looper.myLooper()) {
showDialog()
} else {
Log.d("MainActivity", Thread.currentThread().name)
runOnUiThread {
showDialog();
}
}
}
private fun showDialog() {
AlertDialog.Builder(this@MainActivity)
.setTitle("hello!!!")
.setMessage("updateUI run ...")
.setPositiveButton("确定", null)
.show()
}
}
#include <jni.h>
#include <string>
#include <android/log.h>
#include <pthread.h>
#define TAG "ld"
#define log_debug(...) __android_log_print(ANDROID_LOG_DEBUG,TAG,__VA_ARGS__)
#define log_info(...) __android_log_print(ANDROID_LOG_INFO,TAG,__VA_ARGS__)
jobject mainActivityObj;
JavaVM *jvm;
JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM *javaVm, void *pVoid) {
jvm = javaVm;
return JNI_VERSION_1_6;
}
void *customerThread(void *pVoid) {
JNIEnv *env = nullptr;
jint result = jvm->AttachCurrentThread(&env, 0);
log_debug("创建env结果为:%d", result);
if (result != JNI_OK) {
return 0;
}
jclass mainActivityClass = env->GetObjectClass(mainActivityObj);
const char *sig = "()V";
jmethodID mainMethodId = env->GetMethodID(mainActivityClass, "updateUI", sig);
env->CallVoidMethod(mainActivityObj, mainMethodId);
jvm->DetachCurrentThread();
return 0;
};
extern "C"
JNIEXPORT void JNICALL
Java_com_lu_jni_MainActivity_useThread(JNIEnv *env, jobject thiz) {
mainActivityObj = env->NewGlobalRef(thiz);
pthread_t pthreadID;
pthread_create(&pthreadID, 0, customerThread, mainActivityObj);
pthread_join(pthreadID, 0);
}