C++也来操作线程之JNI线程创建
2014-09-09 09:58
253 查看
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
Jni.java
Android.mk
JniThread.cpp
完成一次线程输出:
本DEMO用C写,屏蔽掉extend,完成跟C++函数调用一样。
百度网盘:http://pan.baidu.com/s/1nt4wfgt
本文来自CSDN博客,转载请联系作者注明出处http://blog.csdn.net/dreamintheworld
先来介绍一下创建线程的函数:
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
相关文章推荐
- 解决多线程操作控件时可能出现的异常:“在某个线程上创建的控件不能成为在另一个线程上创建的控件的父级”
- 当JNI遇到多线程--java对象如何被C++中的多个线程访问?
- 线程间操作无效: 从不是创建控件“”的线程访问它~~~的解决方法~
- OpenMP创建线程中的锁及原子操作性能比较
- OpenMP创建线程中的锁及原子操作性能比较
- 解决多线程操作控件时可能出现的异常:“在某个线程上创建的控件不能成为在另一个线程上创建的控件的父级”
- OpenMP创建线程中的锁及原子操作性能比较
- OpenMP创建线程中的锁及原子操作性能比较
- OpenMP创建线程中的锁及原子操作性能比较
- JAVA与C++::关于JNI中文字符串操作问题总结
- JAVA与C++::关于JNI中文字符串操作问题总结
- 线程间操作无效: 从不是创建控件“xxx”的线程访问它
- OpenMP创建线程中的锁及原子操作性能比较
- OpenMP创建线程中的锁及原子操作性能比较
- OpenMP创建线程中的锁及原子操作性能比较
- 关于 2003转到2005 线程间操作无效: 从不是创建控件“listView1”的线程访问它
- OpenMP创建线程中的锁及原子操作性能比较
- OpenMP创建线程中的锁及原子操作性能比较
- OpenMP创建线程中的锁及原子操作性能比较
- 教你如何解决“线程间操作无效: 从不是创建控件的线程访问它”