#include <unistd.h>
#include <pthread.h>
#include <stdio.h>
int num = 0;
pthread_t pthid;
void * thread_start(void *arg){
while(1){
num++;
usleep(random()%200);
}
}
void * thread_start1(void *arg){
while(1){
printf("num1 = %d\n",num);
num++;
usleep(random()%200);
printf("num2 = %d\n",num);
usleep(random()%200);
}
}
int main(){
srand(time(0));
//创建线程1
pthread_create(&pthid,0,thread_start,(void *)1);
//创建线程2
pthread_create(&pthid,0,thread_start1,(void *)2);
usleep(20000);
}
#include <unistd.h>
#include <pthread.h>
#include <stdio.h>
int num = 0;
pthread_t pthid;
pthread_mutex_t foo_mutex;
void * thread_start(void *arg){
while(1){
//申请加锁
pthread_mutex_lock(&foo_mutex);
num++;
//释放锁
pthread_mutex_unlock(&foo_mutex);
usleep(random()%200);
}
}
void * thread_start1(void *arg){
while(1){
//申请加锁
pthread_mutex_lock(&foo_mutex);
printf("num1 = %d\n",num);
num++;
usleep(random()%200);
printf("num2 = %d\n",num);
//释放锁
pthread_mutex_unlock(&foo_mutex);
usleep(random()%200);
}
}
int main(){
srand(time(0));
//默认锁类型:当一个线程加锁以后,其余请求锁的线程将形成一个等待队列,并在解锁后按优先级获得锁
pthread_mutex_init(&foo_mutex, NULL);
//创建线程1
pthread_create(&pthid,0,thread_start,(void *)1);
//创建线程2
pthread_create(&pthid,0,thread_start1,(void *)2);
usleep(20000);
//销毁锁
pthread_mutex_destroy(&foo_mutex);
}
package com.aruba.ndkapplication;
import android.util.Log;
/**
* Created by aruba on 2020/4/17.
*/
public class ThreadUtils {
public static native void startThread();
public native void setEnv();
public static native void destroy();
public static void getInfoFromC() {
Log.i("ThreadUtils", "getInfoFromC方法被native层调用");
destroy();
}
}
//===================================多线程================================================
#include <pthread.h>
pthread_t pthid;
JavaVM *vm;
jobject g_obj;
//线程方法
void *thread_start(void *arg) {
LOGI("thread_start begin");
JNIEnv *env;
//将线程添加到JVM中
if (vm->AttachCurrentThread(&env, NULL) != JNI_OK) {
LOGI("%s AttachCurrentThread error failed ", __FUNCTION__);
return NULL;
}
sleep(3);
//调用java中的getInfoFromC方法
jclass clz = env->GetObjectClass(g_obj);
jmethodID mid = env->GetStaticMethodID(clz, "getInfoFromC", "()V");
env->CallStaticVoidMethod(clz, mid);
pthread_exit(0);
}
//开启线程
JNIEXPORT void JNICALL
native_startThread(JNIEnv *env, jclass type) {
LOGI("native_startThread begin");
//创建线程
pthread_create(&pthid, 0, thread_start, (void *) 1);
}
//设置环境
JNIEXPORT void JNICALL
native_set_env(JNIEnv *env, jobject jobj) {
if (vm != NULL)
vm = NULL;
env->GetJavaVM(&vm);
//保持ThreadUtils对象
g_obj = env->NewGlobalRef(jobj);
}
//销毁资源
JNIEXPORT void JNICALL
native_destroy(JNIEnv *env, jclass type) {
if (vm != NULL)
vm = NULL;
env->DeleteGlobalRef(g_obj);
}
//多线程
static const JNINativeMethod gMethodsThread[] = {
{
"startThread", "()V", (void *) native_startThread
},
{
"setEnv", "()V", (void *) native_set_env
},
{
"destroy", "()V", (void *) native_destroy
}
};
//注册多线程Method
static int registerNativesThread(JNIEnv *env) {
LOGI("registerNatives begin");
jclass clazz;
//找到java的类
clazz = env->FindClass("com/aruba/ndkapplication/ThreadUtils");
if (clazz == NULL) {
LOGI("clazz is null");
return JNI_FALSE;
}
if (env->RegisterNatives(clazz, gMethodsThread, NELEM(gMethodsThread)) < 0) {
LOGI("RegisterNatives error");
return JNI_FALSE;
}
return JNI_TRUE;
}
//===================================多线程end================================================
Button btn_click3 = findViewById(R.id.btn_click3);
btn_click3.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
ThreadUtils threadUtils = new ThreadUtils();
threadUtils.setEnv();
threadUtils.startThread();
}
});