在Native里面开启线程:
Java端:
@Override
protected void onStart() {
super.onStart();
init();
}
@Override
protected void onStop() {
super.onStop();
finalizeMethod();
}
//=============================================
// 将native线程attach到java线程
//=============================================
// 这个方法里面开启一个线程
public native void init();
//释放资源
public native void finalizeMethod();
/*
* Class: com_example_mystore_MainActivity
* Method: init
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_com_example_mystore_MainActivity_init(
JNIEnv * pJNIEnv, jobject pThis) {
CCLog("AAAA","[init]-------Start");
//先得到JavaVM,将其放在 javaVM 里面
if ((*pJNIEnv)->GetJavaVM(pJNIEnv, &javaVM) != JNI_OK) {
CCLog("AAAA", "出错了");
return;
}
// 得到前端对象
frontendObject = (*pJNIEnv)->NewGlobalRef(pJNIEnv, pThis);
if (frontendObject == NULL ) {
CCLog("AAAA", "出错了");
return;
}
isRunning = 1;
//开始线程相关
pthread_attr_t lAttribute;
int lError = pthread_attr_init(&lAttribute);
if (lError) {
CCLog("AAAA", "出错了");
}
lError = pthread_create(&globalThread, &lAttribute, run, NULL );
if (lError) {
CCLog("AAAA", "出错了");
}
CCLog("AAAA","[init]开始落!");
}
void* run(void* param) {
// Attaches current thread to the Dalvik VM so that it is known
// from Java and can call Java code.
JNIEnv* pJNI = getJNIEnv(javaVM);
if (pJNI == NULL ) {
CCLog("AAAA", "出现了错误!!!");
return NULL ;
}
while (isRunning) {
sleep(5);
int i = 0;
for (i = 0; i < 10; ++i) {
CCLog("AAAA", "i = %d", i);
}
CCLog("AAAA", "--------------------------");
}
}
JNIEnv* getJNIEnv(JavaVM* jVM) {
JavaVMAttachArgs lJavaVMAttachArgs;
lJavaVMAttachArgs.version = JNI_VERSION_1_6;
lJavaVMAttachArgs.name = "NativeThread";
lJavaVMAttachArgs.group = NULL;
JNIEnv* lEnv;
if ((*javaVM)->AttachCurrentThread(javaVM, &lEnv,
&lJavaVMAttachArgs)!=JNI_OK) {
lEnv = NULL;
}
return lEnv;
}
/*
* Class: com_example_mystore_MainActivity
* Method: finalizeMethod
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_com_example_mystore_MainActivity_finalizeMethod(
JNIEnv * pJNIEnv, jobject pThis) {
(*pJNIEnv)->MonitorEnter(pJNIEnv, frontendObject);
isRunning = 0;
(*pJNIEnv)->MonitorExit(pJNIEnv,frontendObject);
pthread_join(&globalThread,NULL);
// 清理任务
(*pJNIEnv)->DeleteGlobalRef(pJNIEnv,frontendObject);
}
这里面需要注意同步问题:
在java端使用 synchronized 锁定某个对象。
然后在native端使用
(*pJNIEnv)->MonitorEnter(pJNIEnv, frontendObject);
xxxxxxx
(*pJNIEnv)->MonitorExit(pJNIEnv,frontendObject);
来锁定其对应的native端对象。