C++也来操作线程之JNI线程创建


Jni中使用线程虽然没有Java那么简单,但是有些情况还是需要使用的。当然,因为Java的线程控制和线程间通话的接口非常丰富,所以大多数情况下可以使用java中的线程代替在C/C++中创建子线程。

先来介绍一下创建线程的函数:


pthread_create
   ------------ #include<pthread.h>
类Unix操作系统(Unix、Linux、Mac OS X等)的创建线程的函数。
若线程创建成功,则返回0。若线程创建失败,则返回出错编号,并且*thread中的内容是未定义的。
linux下用C语言开发多线程程序,Linux系统下的多线程遵循POSIX线程接口,称为pthread。

POSIX 表示可移植操作系统接口(Portable Operating System Interface ,缩写为 POSIX ),POSIX标准定义了操作系统应该为应用程
序提供的接口标准,是IEEE为要在各种UNIX操作系统上运行的软件而定义的一系列API标准的总称,其正式称呼为IEEE 1003,而国际标准名称为ISO/IEC 9945。

参数
第一个参数为指向线程标识符的指针。
第二个参数用来设置线程属性。
第三个参数是线程运行函数的起始地址。
最后一个参数是运行函数的参数。


在linux中,线程实际上就是一个轻量级的进程,因为他们都是通过调用do_fork()函数,传入不同的参数实现的。
线程相对进程来说,
1 切换速度快,其保存现场花费的时间比进程少得多;
2 线程间的同步比进程简单

下来使用例子说明使用:


MainActivity.java

public class MainActivity extends Activity {

	private Button btn_begin;
	private Button btn_end;
	private Jni jni;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		jni = new Jni();
		btn_begin = (Button) findViewById(R.id.btn_begin);
		btn_end = (Button) findViewById(R.id.btn_end);
		btn_begin.setOnClickListener(new View.OnClickListener() {

			@Override
			public void onClick(View v) {
				jni.startThread();
			}
		});
		btn_end.setOnClickListener(new View.OnClickListener() {

			@Override
			public void onClick(View v) {
				jni.endThread();
			}
		});
	}
}

Jni.java

public class Jni {

	public native void startThread();
	public native void endThread();
	
	static{
		System.loadLibrary("com-hello");
	}
}

Android.mk

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE    := com-hello
LOCAL_SRC_FILES := JniThread.cpp

LOCAL_LDLIBS :=-llog

include $(BUILD_SHARED_LIBRARY)

JniThread.cpp

#include<jni.h>
#include <pthread.h>//线程库
#include <android/log.h>//输出日志
#include <unistd.h>//sleep
#include"zy_zh_jni_Jni.h"//扩展C语法

//1=循环条件
int flag = 1;
pthread_t mThread;


void* AlertThreadStub(void*lparam) ;

//启动线程
JNIEXPORT void JNICALL Java_zy_zh_jni_Jni_startThread
  (JNIEnv * env, jobject obj){
	flag = 1;
	int result = pthread_create(&mThread, NULL, AlertThreadStub, NULL);
	__android_log_print(ANDROID_LOG_INFO, "Thread", "#startThread =%d",result);
}

//#结束线程
JNIEXPORT void JNICALL Java_zy_zh_jni_Jni_endThread
  (JNIEnv *env, jobject obj){
	flag = 0;
	//返回值 : 0代表成功。 失败,返回的则是错误号。
	int result = pthread_join(mThread, NULL);//阻塞,所以在Java中请用线程操作它
	__android_log_print(ANDROID_LOG_INFO, "Thread", "#阻塞#Thread end=%d",result);
}

void* AlertThreadStub(void*lparam) {
	while(flag == 1){
		__android_log_print(ANDROID_LOG_INFO, "Thread", "#Thread working#%lu",mThread);
		sleep(2);//睡眠2秒
	}
}

完成一次线程输出:


本DEMO用C写,屏蔽掉extend,完成跟C++函数调用一样。

百度网盘:http://pan.baidu.com/s/1nt4wfgt


本文来自CSDN博客,转载请联系作者注明出处http://blog.csdn.net/dreamintheworld


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值