在Native里面开始线程

本文介绍如何在Java中启动Native线程,并实现两者之间的同步。通过实例代码展示了如何从Java端调用Native方法来创建并运行Native线程,同时讨论了线程同步的重要性及其实现方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在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();


Native端代码 :


/*
 * 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端对象。




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值