下载:

NKD-build在Android studio3.0版本以后就不能再用了,必须使用CMke

Settings -> Appearance & Behavior -> System Settings -> Android SDK ->SDK Tools 勾选 NDK,CMake,LLDB

配置工具:

Settings ->tools->External tools

javah
Program: J D K P a t h JDKPath JDKPath\bin\javah
Arugments:-d …/jni -jni F i l e C l a s s FileClass FileClass
Working directory: S o u r c e p a t h E n t r y SourcepathEntry SourcepathEntry…\java

ndk-build
Program:D:\adt\sdk\ndk-bundle\ndk-build.cmd
Parameters:什么都不用
Working directory: M o d u l e F i l e D i r ModuleFileDir ModuleFileDir\src\main

项目添加:

local.properties:

ndk.dir=D:\tools\adt-bundle-windows-x86_64-20140702\sdk\ndk-bundle

gradle.properties

android.deprecatedNdkCompileLease=1557488036683

app目录下build.gradle:

android{defaultConfig{externalNativeBuild {cmake {cppFlags "-std=c++11 -frtti -fexceptions"// -DLinuxabiFilters  "armeabi-v7a", "arm64-v8a", "x86", "x86_64"}}ndk {abiFilters  "armeabi-v7a", "arm64-v8a", "x86", "x86_64"}}externalNativeBuild {cmake {path "src/main/cpp/CMakeLists.txt"}}
}

Cmake语法

a. 添加包含头文件路径

include_directories(src/main/cpp/include/)

b. add_library()命令用于向CMake添加依赖源文件或库

add_library( # 生成函数库的名称,即libnative-lib.so或libnative-lib.anative-lib #库名字# 生成库类型:动态库为SHARED,静态库为STATIC SHARED# 依赖的c/cpp文件(相对路径) src/main/cpp/native-lib.cpp )

c. find_library()命令用于定位NDK中的库

find_library( # Defines the name of the path variable that stores the#库变量名称log-lib # 即在ndk开发包中查询liblog.so函数库,将其路径赋值给log-lib  log ) #库名称

d.target_link_libraries()命令用于指定要关联到的原生库的库

target_link_libraries( # 指定目标库,与上面指定的函数库名一致native-lib# 链接的库,根据log-lib变量对应liblog.so函数库${log-lib} )

e.#设置生成的so动态库最后输出的路径

set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/../libs/${ANDROID_ABI})

f. 设置clag

add_definitions("-Wall -lpthread -g")

JNI原理

  1. JNIEnv 和 JavaVM
    JavaVM: 是虚拟机在 JNI 层的代表。一个进程只有一个 JavaVM。所有的线程共用一个 JavaVM。
    JNIEnv: 表示 Java 调用 native 语言的环境,封装了几乎全部 JNI 方法的指针。JNIEnv 只在创建它的线程生效,不能跨线程传递,不同线程的 JNIEnv 彼此独立。
    在 native 环境下创建的线程,要想和 java 通信,即需要获取一个 JNIEnv 对象。我们通过 AttachCurrentThread 和 DetachCurrentThread 方法将 native 的线程与 JavaVM 关联和解除关联。
  2. JNI 中全局引用和局部引用的区别
    全局引用: NewGlobalRef 和 DeleteGlobalRef 方法创建和释放一个全局引用, 全局引用能在多个线程中被使用,且不会被 GC 回收,只能手动释放。可以用于线程间共享内存数据。
    局部引用: NewLocalRef 和 DeleteLocalRef 方法创建和释放一个局部引用,局部引用只在创建它的 native 方法中有效,包括其调用的其它函数中有效。因此我们不能寄望于将一个局部引用直接保存在全局变量中下次使用。不用删除局部引用,它们会在 native 方法返回时全部自动释放,但是建议对于不再使用的局部引用手动释放,避免内存过度使用。
    弱全局引用:NewWeakGlobalRef 和 DeleteWeakGlobalRef 创建和释放一个弱全局引用。弱全局引用类似于全局引用,唯一的区别是它不会阻止被 GC 回收
  3. JNI函数的注册过程
    Dalvik虚拟机在调用一个成员函数的时候,如果发现该成员函数是一个JNI方法,那么就会直接跳到它的地址去执行。也就是说,JNI方法是直接在本地操作系统上执行的,而不是由Dalvik虚拟机解释器执行。
    结构体JNIEnv的成员变量functions指向的是一个函数表,这个函数表又包含了一系列的函数指针,指向了在当前进程中运行的Dalvik虚拟机中定义的函数。对于结构体JNIEnv的成员函数RegisterNatives来说,它就是通过调用这个函数表中名称为RegisterNatives的函数指针来注册参数gMethods所描述的JNI方法的

android studio ndk使用相关推荐

  1. JNI编程基础(二)——Android Studio NDK开发

    由于笔者目前的工作是Android开发,所以在JNI开发系列博客中穿插一篇AndroidStudio NDK开发介绍. 随着Android Studio 2.2的推出,Android Studio的N ...

  2. Android Studio NDK环境配置及JNI使用方法

    1.前言 什么是NDK? NDK全称是Native Development Kit,NDK提供了一系列的工具,帮助开发者快速开发C(或C++)的动态库,并能自动将so和java应用一起打包成apk.N ...

  3. Android studio ndk目录无法点击选择

    问题原因 Android studio ndk目录无法点击选择,不能点击,不能设置.在local.properties文件夹加上路径 ndk.dir=C\:\\Users\\zou\\AppData\ ...

  4. android studio ndk HelloWorld 编译环境搭建

    android studio NDK helloworld 项目 第一步 android studio ndk 编译环境搭建 http://yunpan.cn/c3cCxxgwrqDaL 访问密码 6 ...

  5. Android Studio NDK 代码 Source Insight调试 (NDK 目前开发方案 | NDK 编译 | 导入 so 库 | 项目编码转换)

    作者 : 韩曙亮 转载请注明出处 : http://blog.csdn.net/shulianghan/article/details/52088039 最近在移植一个 JNI 项目, 比较纠结, A ...

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

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

  7. NDK 在 Android studio如何使用(Android studio NDK)

    其实这个东西入门的话.直接在官网查找demo再结合文档就能间接了解如何构建是最快捷的. 这里提供一下官网和demo的地址. 官网的NDK在Android studio的搭建:http://tools. ...

  8. Android Studio NDK 开发配置

    一:使用gradle experimental plugin 首先,我们不能用android studio默认的gradle插件,我们需要把android studio的插件改为gradle expe ...

  9. Android Studio NDK开发

    以前接触过NDK的开发,是在Eclipse环境下开发的.今天尝试了下用Android Studio来配置,结果真是处处都是坑,现在总结一下: 一.步骤 1. 首先创建MainActivity,添加na ...

  10. android 调用.h文件,[Android Studio / NDK] 如何使用javah生成.h文件

    找到一个在Android上使用OpenCV的可行方法: 版本: OpenCV-3.1.0-android-sdk Android Studio 1.4 JDK 1.7.0_21 主要参考了这篇文章中的 ...

最新文章

  1. html img 指定旋转角度_ALLEN老师自动化测试小课堂 | 生成HTML可视化报告的两个常见模块...
  2. 项目收获与体会_员工之声|在项目实践中提高,在团队合作中成长——参与项目有感...
  3. Retrofit解析网页Json数据简单实例
  4. 【6】C++语法与数据结构之STL_list学生管理系统_链表外排序_函数指针
  5. JS只能输入数字,数字和字母等的正则表达式
  6. 根据中文修改英文翻译,重新生成英文翻译文件(保证原有文件的顺序不变)
  7. nuxt服务端php,nuxt服务端部署上线
  8. 文档 hbase_0783-6.2.0-如何在Hue中集成HBase
  9. 四川大学计算机专业调剂,2019四川大学计算机学院考研调剂信息(第二批)
  10. dsoframer java_DSOFramer的使用
  11. c语言冒泡法输出最小值,C语言冒泡排序法及冒泡法思路
  12. Xshell 5 注册码
  13. 神经网络简介及简单应用
  14. 苹果账号授权登录APP 服务端验证
  15. MAUI Developer Day in GCR
  16. Week7 B - TT 的旅行日记
  17. C++ 使用Intel Media SDK 实现H.264硬编码
  18. 文件系统模拟程序python_树莓派开发实战(第2版)
  19. CCRC信息安全服务资质。
  20. NOIP2017模拟赛(4) 总结

热门文章

  1. SAP,ABAP自开发批导程序批量维护ME11、ME12信息记录,涉及表EINA、EINE
  2. Win10快速新建名为当前日期的文件夹
  3. xctf攻防世界parallel-comparator-200 writeup
  4. 关于SAP EWM看着一篇就够了(三)完结篇
  5. 中亦科技将二度上会:八成收入来自金融,研发、销售投入有待平衡
  6. Qt的qDebug使用
  7. 手机端适用:图片拖拽排序v-dragging
  8. android聊天会话代码,Android 即时聊天-融云IM集成。
  9. 计算机需不需要考英语口语,英语四级口试必须考吗 不考会怎样
  10. python3代码兼容python2