Android(安卓)Stduio 3.0进行JNI和NDK开发
标签: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++的支持
步骤
- AS3.0左上角File->选择Link C++ project with Gradle
- 选择
CMake
- 将
方法一
生成的CMakeLists.txt
复制到本工程的app/src
目录下和main
平级 Project Path
中选择复制好的CMakeLists.txt
文件- 完成导入
在新老工程中如何进行C++开发
1、新建一个JniUtils2.java文件-编写需要native实现的Java类和方法
public class JniUtils2 { static { System.loadLibrary("native-lib"); //CMakeLists.txt中指定的仓库名 } public native String getStringFromC();}
2、生成JniUtils2的native方法
对应的头文件
- 进入
JniUtils2.java
所在的src/main/java
目录- 执行命令
Javah com.hao.jniapp.JniUtils2
也就是Javah 包名.类名
- 最终在
src/main/java
目录中生成头文件com_hao_jniapp_JniUtils2.h
- 将
头文件
移动到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均可)
- 实现
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
等手写的地方出现拼写错误。请按照顺序仔细排查。
更多相关文章
- 如何在Windows下搭建Android开发环境(转)
- Android(安卓)DatePicker的简单自定义
- 关于android app跳转和从web跳转的问题(转载修正)
- Android(安卓)获取 AudioRecord 麦克风音量大小并做选择性发送
- android Support Annotations(注解支持)
- [中英文对照]android Designing for TV(三) ------ Handling Fea
- Android(安卓)SVG支持
- 工程android配置windows7下cocos2d-x、android的开发环境
- android uiautomator学习(一)创建工程