标签:Android Studio 3.0 JNI NDK
转载请注明:http://blog.csdn.net/feather_wch/article/details/79548978

Android Stduio 3.0进行JNI和NDK开发

版本:2018/3/14-1(0:41)

本文主要包括两方面的内容:
1. 如何在Android Studio 3.0中在新工程和老工程中进行JNI和NDK相关的支持
2. 如何在新工程和老工程中对JNI进行开发

  • Android Stduio 3.0进行JNI和NDK开发
    • 前提
    • 第一种:新建工程中选择C++支持
      • 支持C++相关的重要文件
    • 第二种:老项目中添加C++的支持
      • 步骤
    • 在新老工程中如何进行C++开发


Android Studio 3.0进行JNI/NDK开发时,如何让项目能支持JNI功能主要有两种方法。第一种是Android Stduio 3.0中新建工程时进行C++的支持。第二种是在老项目中添加C++的支持。

前提

下载NDK、LLDB、CMake-位于settings->Android SDK->SDK Tools

第一种:新建工程中选择C++支持

步骤:
1. 新建工程,New->New Project
2. 选择include C++ Support
3. 一路默认选择,直到选择完finish

支持C++相关的重要文件

  • app\src\main\cpp文件夹

    里面存放的native-lib.cpp就是系统默认的C++文件,用于编写native代码

  • app/src/CMakeLists.txt

    生成so库的配置文件,描述了so库的名称,以及所依赖的具体源文件(如:native-lib.cpp)

# [CMakeLists.txt] 1. 设置构建native库所需要的CMake的最小版本cmake_minimum_required(VERSION 3.4.1)add_library(             # 2. 设置库的名字             native-lib             # 3. 将库设置为共享型库(Gradle会自动将共享库打包到APK中)             SHARED             # 4. 提供源码文件的相对路径             src/main/cpp/native-lib.cpp )find_library(              log-lib              log )target_link_libraries(                       # 5. 目标库的名称                       native-lib                       # 6. 将目标库和NDK中的log库连接起来                       ${log-lib} )
  • build.gradle文件新增配置内容
android {    compileSdkVersion 26    defaultConfig {        ...        //===增加如下内容===        externalNativeBuild {            cmake {                cppFlags ""            }        }    }    buildTypes {        ...    }    //===增加如下内容,指明CMake的配置文件===    externalNativeBuild {        cmake {            path "CMakeLists.txt"        }    }}dependencies {    ...}

第二种:老项目中添加C++的支持

步骤

  1. AS3.0左上角File->选择Link C++ project with Gradle
  2. 选择CMake
  3. 方法一生成的CMakeLists.txt复制到本工程的app/src目录下和main平级
  4. Project Path中选择复制好的CMakeLists.txt文件
  5. 完成导入

在新老工程中如何进行C++开发

1、新建一个JniUtils2.java文件-编写需要native实现的Java类和方法

public class JniUtils2 {    static {        System.loadLibrary("native-lib"); //CMakeLists.txt中指定的仓库名    }    public native String getStringFromC();}

2、生成JniUtils2的native方法对应的头文件

  1. 进入JniUtils2.java所在的src/main/java目录
  2. 执行命令Javah com.hao.jniapp.JniUtils2也就是Javah 包名.类名
  3. 最终在src/main/java目录中生成头文件com_hao_jniapp_JniUtils2.h
  4. 头文件移动到cpp目录中
/* DO NOT EDIT THIS FILE - it is machine generated */#include /* Header for class com_hao_jniapp_JniUtils2 */#ifndef _Included_com_hao_jniapp_JniUtils2#define _Included_com_hao_jniapp_JniUtils2#ifdef __cplusplusextern "C" {#endif/* * Class:     com_hao_jniapp_JniUtils2 * Method:    getStringFromC * Signature: ()Ljava/lang/String; */JNIEXPORT jstring JNICALL Java_com_hao_jniapp_JniUtils2_getStringFromC  (JNIEnv *, jobject);#ifdef __cplusplus}#endif#endif

3、创建C++源代码xxx.cpp(自定义,例如:abc.cpp或者com_haoe_jniapp_JniUtils2.cpp均可)

  1. 实现native方法
//com_haoe_jniapp_JniUtils2.cpp-拼写一定要正确!!!#include "com_hao_jniapp_JniUtils2.h"extern "C" {JNIEXPORT jstring JNICALL Java_com_hao_jniapp_JniUtils2_getStringFromC        (JNIEnv *env, jobject jobject1) {    return env->NewStringUTF("我是来自JniUtils2的Native方法");}}

4、CMakeLists.txt将源码引入

cmake_minimum_required(VERSION 3.4.1)add_library(            #1. 库名不变             native-lib             SHARED             src/main/cpp/native-lib.cpp             src/main/cpp/main.cpp            #2. 新增新功能cpp源码-拼写一定要正确!!!             src/main/cpp/com_hao_jniapp_JniUtils2.cpp             )             //......

5、Clean Project

或者将app/build/intermediates/cmake中的debug和realease中所有so文件删除

6、Make Project

整个项目就都可以编译运行了,如果有CMake的错误,很可能是有用到Java_com_hao_jniapp_JniUtils2_getStringFromC等手写的地方出现拼写错误。请按照顺序仔细排查。

更多相关文章

  1. 如何在Windows下搭建Android开发环境(转)
  2. Android(安卓)DatePicker的简单自定义
  3. 关于android app跳转和从web跳转的问题(转载修正)
  4. Android(安卓)获取 AudioRecord 麦克风音量大小并做选择性发送
  5. android Support Annotations(注解支持)
  6. [中英文对照]android Designing for TV(三) ------ Handling Fea
  7. Android(安卓)SVG支持
  8. 工程android配置windows7下cocos2d-x、android的开发环境
  9. android uiautomator学习(一)创建工程

随机推荐

  1. API 23 view.ViewGroup——属性分析
  2. 根据电话号码查找人名
  3. android基础知识点复习之短信发送
  4. android studio 0.6.0 下载地址
  5. 手工下载android sdk或者system images等
  6. Android SeekBar
  7. Android SDK Manager 更新SDK问题
  8. mac 编译 Android 系统杂记
  9. Android设计中的.9.png
  10. textAppearance 解答,android系统主题样式