这一篇将初步介绍NDK开发中多线程方面相关操作,具体步骤如下:

多线程采用 POSIX 的pthread方式实现.

<1> : 新建一个Android工程 androidpthreadjnidemo.然后在工程目录新建jni文件夹,在src下新建一个org的package,然后再这个package包下新建一个pthreadClass.java,pthreadClass的类的实现如下:

看来virtual box的剪贴板老是有问题.切换到host这边来.

<2> : 在jni目录下新建onload.h,onload.cpp,pthreadClass.cpp,其中这个pthreadClass.cpp和pthreadClass.java文件没有文件上的牵连关系,也可以命名为sb.cpp,这里只需要注意,如果是按照c++的方式实现程序代码,

那么JNIEnv* env这个用,比如:

C代码:
(*env)->FindClass("org/pthreadClass");
而C++代码:
env->FindClass("org/pthreadClass");具体原因可以自行查找,大致思想是jni已经做了C和C++的区分,所以要注意他们的书写方式.

我这里是使用C++的,所以全部采用下面的那种书写方式.

<3> : onload.cpp,onload.h是通用的,可以在以后工程中统一都添加进来.

onload.cpp:

#include "onload.h"
#include <android/log.h>
#include <stdlib.h>
#include <stdio.h>
#include <assert.h>
#include <string.h>
#define TAG "jni_thread"
#define LOGI(...) ((void)__android_log_print(ANDROID_LOG_INFO,TAG,__VA_ARGS__))
#define LOGW(...) ((void)__android_log_print(ANDROID_LOG_WARN,TAG,__VA_ARGS__))
#define LOGE(...) ((void)__android_log_print(ANDROID_LOG_ERROR,TAG,__VA_ARGS__))extern int register_android_pthread_jni_demo(JNIEnv* env);JavaVM* mEnv;JavaVM* getJNIVM(){JavaVM* env=NULL;if(mEnv->GetEnv((void**)&env,JNI_VERSION_1_4)){return NULL;}return env;}
int jniRegisterNativeMethods(JNIEnv* env,const char* classname,const JNINativeMethod* gMethods,int numMethods){jclass classz;classz=env->FindClass(classname);if(classz==NULL){return JNI_ERR;}if(env->RegisterNatives(classz,gMethods,numMethods)<0){return JNI_ERR;}return JNI_OK;}
int jniThrowExeption(JNIEnv *env,const char* classname){jclass classz;classz=env->FindClass(classname);if(classz==NULL){return JNI_ERR;}return JNI_OK;}
jint JNI_OnLoad(JavaVM *vm, void *reserved){JNIEnv* env=NULL;jint result=JNI_ERR;mEnv=vm;if(vm->GetEnv((void**)&env,JNI_VERSION_1_4)!=JNI_OK){return result;}if(register_android_pthread_jni_demo(env)!=JNI_OK){goto end;//will not continue register others native methods//goto end at once
    }return JNI_VERSION_1_4;end:return result;}

onload.h:

#include<jni.h>
#ifndef _ON_LOAD_HEADER_H__
#define _ON_LOAD_HEADER_H__JavaVM* getJNIVM();
int jniRegisterNativeMethods(JNIEnv* env,const char* classname,const JNINativeMethod* gMethods,int numMethods);
int jniThrowExeption(JNIEnv *env,const char* classname);
jint JNI_OnLoad(JavaVM *vm, void *reserved);#endif

pthreadClass.cpp:

#include <jni.h>
#include <android/log.h>
#include <pthread.h>#include "onload.h"#define TAG "jni_thread"#define LOGI(...) ((void)__android_log_print(ANDROID_LOG_INFO,TAG,__VA_ARGS__))
#define LOGW(...) ((void)__android_log_print(ANDROID_LOG_WARN,TAG,__VA_ARGS__))
#define LOGE(...) ((void)__android_log_print(ANDROID_LOG_ERROR,TAG,__VA_ARGS__))
#define NUMT 5
#define JAVA_CLASS_PATH "org/pthreadClass"
namespace android{void native_init(){LOGI("native init .");}void* fun_in_thread(void* arg){LOGI("enter in fun_in_thread !");}void main_pThread(){LOGI("MAIN THREAD");pthread_t pt[NUMT];int i;for(i=0;i<NUMT;i++){pthread_create(&pt[i],NULL,&fun_in_thread,(void*)i);}}}using namespace android;JNINativeMethod mNativeMethods[]={{"nativeinit","()V",(void*)native_init},{"mainthread","()V",(void*)main_pThread}
};int register_android_pthread_jni_demo(JNIEnv* env){return jniRegisterNativeMethods(env,JAVA_CLASS_PATH,mNativeMethods,sizeof(mNativeMethods)/sizeof(mNativeMethods[0]));}

要实现多线程,必须要包含<pthread.h>头文件,实现创建新的线程的方式如下:

pthread_create(&pt[i],NULL,&fun_in_thread,(void*)i);

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

可以参考:https://publib.boulder.ibm.com/iseries/v5r1/ic2924/index.htm?info/apis/users_14.htm
上面的程序实现了连续创建5个线程.

Android.mk文件:

LOCAL_PATH    :=$(call my-dir)
include $(CLEAR_VARS)LOCAL_MODULE    := threadlibLOCAL_SRC_FILES    := onload.cpp pthreadClass.cppLOCAL_SHARED_LIBRARY := libnativehelper liblog
#下面一句cflags可以不需要
LOCAL_CFLAGS := -llog -lpthread
#添加log的
LOCAL_LDLIBS    :=-lloginclude $(BUILD_SHARED_LIBRARY)

Android java代码中调用:

显示结果如下:

工程整个文件结构:

其他信息:

Android NDK JNI C++ 13 pthread多线程相关推荐

  1. Android NDK使用之--用pthread实现多线程

    Android系统本身包括Java和Linux内核:因此在Android应用中实现多线程就可以是基于Java上的和基于Linux上的:今天本文介绍的就是Android利用Linux下的pthread来 ...

  2. Android NDK JNI 的简单使用

    为什么80%的码农都做不了架构师?>>>    1.why: 为啥学 NDK开发,其实是为了项目需要调用底层的一些C/C++的一些东西:另外就是为了效率更加高些: Android n ...

  3. Android NDK JNI 简单例子2

    转载请标明出处: http://blog.csdn.net/michael1112/article/details/55271823 江东橘子的博客 前言 使用Android studio 进行NDK ...

  4. android ndk jni so,Android Studio Ndk So 文件

    一 下载NKD,并解压 官网:https://developer.android.com/index.html 二 新建项目 1 新建Android Studio项目 2 项目配置NDK路径 imag ...

  5. Android NDK jni开发,适当的给Android 代码加密

    为什么使用ndk开发了,就是 稍微将代码隐藏一下..Android 虽然打包能混淆,但是有些东西是不能混淆的,如下图,压缩密码把直勾勾的下载代码中.下面手把手稍微优化下. 將操作密码的部分我们通过 j ...

  6. Android NDK JNI 简单例子1 : Android NDK配置和下载

    转载请标明出处: http://blog.csdn.net/michael1112/article/details/55004944 江东橘子的博客 下载和配置NDK: --请使用AS2.2 或更高版 ...

  7. Android NDK JNI WARNING: illegal start byte 0x

    今天攻克了JNI WARNING: illegal start byte 0x81这个问题. 问题出现的现象是通过jni调用加密方法,调用之后返回密文内容,结果就出现这个问题. 在国外查找一段时间之后 ...

  8. Android NDK JNI开发3

    换个浏览器来发,IE10不能够上传图片,兼容问题. 还是和上一篇一样的步骤,不过这次函数带了参数: <1> : eclipse新建一个hellojnidemo3工程,然后将cgywin切换 ...

  9. android NDK JNI设置自己的log输出函数

    就是define一下 #include <android/log.h> #define LOGI(...) ((void)__android_log_print(ANDROID_LOG_I ...

最新文章

  1. 在Python中使用lightgbm
  2. Vue.js:监听属性
  3. php停车场计时收费软件,城市街道停车计时收费系统 路边停车收费软件
  4. 提问征集:对话VLC首席开发者Jean-Baptiste Kempf
  5. Java每天5道面试题,跟我走,offer有!(九)
  6. gatling 使用_使用Gatling + Gradle + Jenkins Pipeline为您的JAX-RS(和JavaEE)应用程序进行连续压力测试...
  7. Hibernate 映射文件基本概述
  8. 拼音字母搜索匹配汉字
  9. GB2312编码理解
  10. Linux 常用软件
  11. 高考数学圆锥曲线知识点:解题技巧
  12. 简单粗暴日文键盘布局改为其他语言键盘布局
  13. Echarts模板(一):南丁格尔玫瑰图
  14. 【深入kotlin】 - 匿名函数、闭包和接收者
  15. 在VMware上如何创建虚拟机以及安装linux系统
  16. pointer-events: none;属性。pointer-events: none;看得见摸不着,点击穿透。
  17. tc ebpf sample - tethering offload on linux pc
  18. 算法[第四版]-图灵程序设计丛书-笔记
  19. asp一句话html,asp常用的一句话木马大全
  20. 用python实现一个【简易记事本】吧

热门文章

  1. MongoDB 基本操作增删改查
  2. 使用VMwork Station Pro 14 安装CentOS7.6详细教程
  3. 使用expect实现shell自动交互
  4. Awesome Projects (汇聚全球所有
  5. ngModel 值不更新/显示
  6. 第一个项目的需求分析
  7. 一个苏州IT人的5年挨踢经历-------面试篇(之三)
  8. 政府免费WiFi遭吐槽:近七成网友表示从未用过
  9. Spring MVC ajax:post/get 的具体实现
  10. 创建Cocos2d-x 3.x项目以及项目结构简要说明