最新androidStudio上jni开发全覆盖

来源:互联网 发布:从概念到数据分析 pdf 编辑:程序博客网 时间:2024/04/30 00:10
JNI(Java Native Interface):Java本地接口。是为了方便Java调用c、c++等本地代码所封装的一层接口(也是一个标准)。大家都知道,Java的优点是跨平台,但是作为优点的同时,其在本地交互的时候就编程了缺点。Java的跨平台特性导致其本地交互的能力不够强大,一些和操作系统相关的特性Java无法完成,于是Java提供了jni专门用于和本地代码交互,这样就增强了Java语言的本地交互能力。
NDK(Native Development Kit) : 原生开发工具包,即帮助开发原生代码的一系列工具,包括但不限于编译工具、一些公共库、开发IDE等
在Android Studio 2.2 之后,工具中增加了 CMake 的支持,你可以这么认为,在 Android Studio 2.2 之后你有2种选择来编译你写的 c/c++ 代码。一个是 ndk-build + Android.mk + Application.mk 组合,另一个是 CMake + CMakeLists.txt 组合。这2个组合与Android代码和c/c++代码无关,只是不同的构建脚本和构建命令。

ABI(Application binary interface)应用程序二进制接口。不同的CPU 与指令集的每种组合都有定义的 ABI (应用程序二进制接口),一段程序只有遵循这个接口规范才能在该 CPU 上运行,所以同样的程序代码为了兼容多个不同的CPU,需要为不同的 ABI 构建不同的库文件。当然对于CPU来说,不同的架构并不意味着一定互不兼容。

  • armeabi设备只兼容armeabi;
  • armeabi-v7a设备兼容armeabi-v7a、armeabi;
  • arm64-v8a设备兼容arm64-v8a、armeabi-v7a、armeabi;
  • X86设备兼容X86、armeabi;
  • X86_64设备兼容X86_64、X86、armeabi;
  • mips64设备兼容mips64、mips;
  • mips只兼容mips
以上内容都来自于百度百科和简书。主要用于扫盲。微笑
下面介绍这四个函数
第一个不说了,就是要求的最低版本
cmake_minimum_required(VERSION 3.4.1)# 编译出一个动态库 myjni,源文件只有 src/main/jni/myjni.cadd_library(myjni SHARED myjni.c)# 找到预编译库 log_lib 并link到我们的动态库 myjni中,就是下面两个函数的作用find_library(log-lib log)target_link_libraries(myjni ${log-lib})
(以上四个函数在向现有项目添加 C/C++ 代码中有重要作用)

开始正题

  1. 首先你需要下载 NDK 和构建工具
       在打开的项目中,从菜单栏选择 Tools > Android > SDK Manager。 
       点击 SDK Tools 标签。 
       选中 LLDBCMakeNDK 旁的复选框,
       三个部分都必须下载下来,LLBD是一种一种调试程序,Android Studio 使用它来调试原生代码

接下来

    如果你是要创建支持 C/C++ 的新项目,那就soeasy了

    创建支持原生代码的项目与创建任何其他 Android Studio项目类似,不过前者还需要额外几个步骤:
  1. 在向导的 Configure your new project 部分,选中 Include C++ Support 复选框。
  2. 点击 Next
  3. 正常填写所有其他字段并完成向导接下来的几个部分。
  4. 在向导的 Customize C++ Support 部分,您可以使用下列选项自定义项目:
    • C++ Standard:使用下拉列表选择您希望使用哪种 C++ 标准。选择 Toolchain Default 会使用默认的 CMake 设置。
    • Exceptions Support:如果您希望启用对 C++ 异常处理的支持,请选中此复选框。如果启用此复选框,Android Studio 会将-fexceptions 标志添加到模块级build.gradle 文件的cppFlags 中,Gradle 会将其传递到 CMake。
    • Runtime Type Information Support:如果您希望支持 RTTI,请选中此复选框。如果启用此复选框,Android Studio 会将-frtti 标志添加到模块级build.gradle 文件的cppFlags 中,Gradle 会将其传递到 CMake。
  5. 点击 Finish

    现有工程中添加JNI
    这个说实话,有点难度,给你个官网给你用户指南  https://developer.android.google.cn/studio/projects/add-native-code.html#new-project大哭,但是我没大看明白
   好吧那就自己来。。。

打开工程


在src\main\目录下新建一个名为jni的目录(名称和父目录可以随意)

在src\main\jni\目录内新建一个名称为CMakeLists.txt的文件(该文件名称固定为CMakeLists.txt)CMakeLists.txt文件也可在项目根目录下新建

CMakeLists.txt的内容就是上面的那四个函数

cmake_minimum_required(VERSION 3.4.1)

add_library(myjni SHARED myjni.c)

find_library(log-lib log)

target_link_libraries(myjni ${log-lib})

接下来

在src\main\jni\目录内新建一个c文件myjni.c,在文件中添加  #include <jni.h>

点击IDE菜单的android目录下,选中项目app右击---》Link C++ Project with Gradle 

Build System选择CMake
Project Path选择上面创建的CMakeLists.txt

点击确定


再接下来

在java文件中添加native代码


static {    System.loadLibrary("myjni");}public native String helloJni();

还有一个牛逼的操作是这个不用生成头文件。。。

鼠标点击放到native函数上(后面那个函数名helloJni)

会提示Cannot resolve corresponding JNI function Java_com_example_jiang_hellojnitest_MainActivity_helloJni

按Alt + Enter点击Create---

神奇的一幕发生了。。。。

JNIEXPORT jstring JNICALLJava_com_example_yaphet_javausec_JNII_helloJni(JNIEnv *env, jobject instance) {    // TODO    char * returnValue=" I am from C";    return (*env)->NewStringUTF(env, returnValue);}

自动生成了原生代码里的函数。接下来的是工作就是调用了,没啥难度。。。

原创粉丝点击