Android Studio2.3上JNI开发

来源:互联网 发布:淘宝开店认证链接网址 编辑:程序博客网 时间:2024/05/24 01:43

转自:http://blog.csdn.net/yichang666/article/details/70228096

Android Studio2.2以后取代了原先的jni文件夹和mk文件,取代的是cpp文件夹,采用新的cmake编译方式,大大的简化了以前复杂的jni开发流程。

  1)先说下官方提供的最简单的JNi开发,ndk的配置肯定是需要,但是还需要添加另外两个配置,可以直接在Setting-System Setting-Android SDK直接下载cmake和LLDB(NDK调试工具)


  2)新建工程,跟一般项目不一样,在configure your new project时需要勾上Include C++ support

  3)中间步骤就是一直选择next就可以,但是在Customize C++ Support选项卡中,可以进行对以下属性进行配置:

  • C++ Standard:点击下拉框,可以选择标准 C++,或者选择默认 CMake 设置的 Toolchain Default 选项。
  • Exceptions Support:如果你想使用有关 C++ 异常处理的支持,就勾选它。勾选之后,Android Studio 会在 module 层的 build.gradle 文件中的cppFlags 中添加-fexcetions 标志。
  • Runtime Type Information Support:如果你想支持 RTTI,那么就勾选它。勾选之后,Android Studio 会在 module 层的 build.gradle 文件中的cppFlags 中添加-frtti 标志  

   4)生成的项目列表如下

  c++文件放在cpp文件夹,比如这里为native-lib.cpp文件,CMakeLists.txt文件在app目录下,在gradle中对于cmakelists文件路径进行了配置,对整个项目进行Make Project,就可以自动生成.so文件,如下图所示:


在图左侧中生成了一个cmake的文件夹,由于没有在gradle中配置CPU类型,这里生成不同类型的.so文件。在Java文件中通过System.loadLibrary导入了so文件,并且书写了native方法来调用c++代码。
先了解cmakeLists文件的配置,方便于了解so文件的生成,

 cmake_minimum_required(VERSION 3.4.1) #cmake的版本声明
 add_library(native-lib SHARED src/main/cpp/native-lib.cpp) #编译目标cpp文件生成so文件 add_library(lib_jni             SHARED  #动态库             IMPORTED)
 set(SOURECEDIR  ${CMAKE_SOURCE_DIR}/..)#给变量设定指定值
set_target_properties(lib_jni PROPERTIES IMPORTED_LOCATION
${CMAKE_SOURCE_DIR}/../jniLibs/${ANDROID_ABI}/lib_jni.so) #添加第三方提供的so文件
target_include_directories(native-lib PRIVATE ${jni-dir}/include) #配置所需头文件的路径
target_link_libraries(lib_jni
                       native-lib) #设置所有需要链接库的名称(包括静态库和动态库)
   native-lib.cpp文件中的代码比较简单,这里简单说明下
 #include <jni.h>   //导入头文件 #include <string> extern "C"   //jni中方法都是用c方式定义的,这里采用的c++文件,加入这段,表示这部分代码按C语言编译 JNIEXPORT jstring JNICALL  //固定编写格式 其中jstring为返回类型,代表的是java里的string类型 Java_hiar_myapplication_MainActivity_stringFromJNI(   //Java_包名_类名_方法名        JNIEnv *env,        jobject /* this */) {   //除了java方法传递过来的参数,还需要包含这两个参数    std::string hello = "Hello from C++";      return env->NewStringUTF(hello.c_str());  //输出字符串 }

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 刚拿驾照不敢上路怎么办 雅思考试作文格式写错了怎么办 英国银行卡注销后钱怎么办 本科毕业有毕业证没有学位证怎么办 莫名收到平安一账通验证码怎么办 新车没带行驶证怎么办 深圳行驶证副本丢了怎么办 新车行驶证是怎么办的 新车怎么办牌和行驶证 b本扣12分了怎么办 车的绿本丢了怎么办 车辆落户查不到购车发票怎么办 扣车凭证丢了怎么办 三轮车驾驶证被扣了怎么办 违章12分不够扣怎么办 忘记带行驶证了怎么办 开车不带行驶证怎么办 屏幕没碎黑屏了怎么办 三星s6屏幕不亮怎么办 苹果手机掉水里屏幕黑屏怎么办 三星s6电池不耐用怎么办 台式电脑显示屏坏了怎么办 三星笔记本电脑不显示韩文怎么办 三星s6开不开机怎么办 电脑显示屏显示检测信号线怎么办 三星s8屏幕坏了怎么办 手机挤压漏液了怎么办 三星显示器跳白色线条怎么办动 三星s6屏幕漏液怎么办 三星电视曲面屏碎了怎么办 平板摔了花屏怎么办 新手机开不了机怎么办 三星a9屏幕漏液怎么办 小米note后面玻璃碎了怎么办 换手机微信钱包怎么办 内外屏一体手机屏幕碎了怎么办 苹果手机显示屏坏了怎么办 华为手机屏裂了怎么办 乐视手机屏坏了怎么办 红米手机触屏失灵怎么办 小米4排线断了怎么办