使用实验性的 Gradle 工具构建 Android NDK 环境
2016-03-12 23:14
656 查看
本文阐述如何在 Android Studio 中使用实验性的 Gradle 工具构建 Android NDK 的开发环境,其中 native 部分使用 cpp 文件。
新版本的工具已不再需要 Android.mk 和 Application.mk 文件,也不需要手动 javah 生成头文件,更不需要 cygwin 等的辅助。
版本号:
所使用的 experimental plugin 版本为:gradle-experimental:0.4.0
所使用的 Android Studio 版本为:1.5.1
操作步骤:
新建一个Project
打开 Project 视图
修改
确认
修改
第一行加上model
如果是应用,则改成
如果是库,要改成
后面部分的
里面的属性都加上等号,
打开 Project Structure
选择 SDK Location,关注 Android NDK location 部分。尚未下载时,此处会出现可点击的链接与提示,直接点击下载即可
回到
在
在
在
点击标红的方法名,
检查 JNI 文件夹下,应该自动创建文件并生成了下述代码
重命名(
回到 FaceHelper.java 文件,声明另一个方法
同样
至此,可以删除之前的临时方法 ndkTmp 的相关代码,包括在
添加相关头文件、完成 logDebug 方法,将
现在可以在 MainActivity 的 onCreate 方法中调用该方法来测试了:
运行之后,在 logcat 中捕捉到我们设定的 log:
至此,环境搭建完成。往后需要添加方法的时候,可以在 FaceHelper.java 中声明,然后 Alt+Enter 自动完成,接着去 Face.cpp 中把生成的方法代码移动到
若本文对你有帮助,请扫描左边的二维码;若本文对你没有帮助,请扫描右边的二维码。谢谢客官。
目前已有 7 人因为本文获得帮助并表达谢意,已有 2 人表示虽然没有帮助但是仍然表示感谢。
新版本的工具已不再需要 Android.mk 和 Application.mk 文件,也不需要手动 javah 生成头文件,更不需要 cygwin 等的辅助。
版本号:
所使用的 experimental plugin 版本为:gradle-experimental:0.4.0
所使用的 Android Studio 版本为:1.5.1
操作步骤:
新建一个Project
打开 Project 视图
修改
./build.gradle(最外层的build.gradle),内容为
classpath 'com.android.tools.build:gradle-experimental:0.4.0'
确认
./gradle/wrapper/gradle-wrapper.properties中版本号为 2.8
distributionUrl=https://services.gradle.org/distributions/gradle-2.8-all.zip
修改
./app/build.gradle(module的build.gradle),这个比较麻烦。分几步吧:
第一行加上model
如果是应用,则改成
apply plugin: 'com.android.model.application'
如果是库,要改成
apply plugin: 'com.android.model.library'
后面部分的
android外层用
model{}包起来,
buildTypes等部分移到
android的外面
里面的属性都加上等号,
minSdkVersion和
targetSdkVersion要加上
.apiLevel,以及其它一些细微而繁琐的变动,参考下述代码段。注意,如果你使用更新版本的 plugin (目前最新是
0.6.0-alpha5),该文件可以修改起来会略微简单一些
apply plugin: 'com.android.model.application' model{ android { compileSdkVersion = 23 buildToolsVersion = "23.0.1" defaultConfig.with { applicationId = "andy.studentingeo" minSdkVersion.apiLevel = 21 targetSdkVersion.apiLevel = 23 versionCode = 1 versionName = "1.0" buildConfigFields.with { create() { type = "int" name = "VALUE" value = "1" } } } } android.buildTypes { release { minifyEnabled = false proguardFiles.add(file('proguard-rules.pro')) } } } dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) testCompile 'junit:junit:4.12' compile 'com.android.support:appcompat-v7:23.1.1' compile 'com.android.support:support-v4:23.1.1' compile 'com.android.support:design:23.1.1' }
打开 Project Structure
选择 SDK Location,关注 Android NDK location 部分。尚未下载时,此处会出现可点击的链接与提示,直接点击下载即可
回到
./app/build.gradle(module的build.gradle),在
model{}中加入下述内容,并 Sync 一下 Gradle
android.ndk { moduleName = "Face" // 本行为自定义的native代码module名 cppFlags.add("-std=c++11") // c++11支持 cppFlags.add("-fexceptions") ldLibs.addAll(["android", "EGL", "GLESv2", "dl", "log", "z"]) stl = "gnustl_shared" }
在
appmodule 下新建一个 JNI 文件夹(默认从
src/main/jni中找 c/c++ 文件)
在
java下新建一个 Java 类,我命名为
FaceHelper
在
FaceHelper.java中静态加载 native 库,库名为前述
android.ndk{}中自定义的
moduleName,并添加一个临时方法 ndkTmp
public class FaceHelper { static { System.loadLibrary("Face"); } public static native void ndkTmp(); }
点击标红的方法名,
Alt+Enter选第一项
检查 JNI 文件夹下,应该自动创建文件并生成了下述代码
重命名(
Shift + F6)
Face.c文件为 cpp 后缀,然后 Sync 一下 Gradle
回到 FaceHelper.java 文件,声明另一个方法
public static native void logDebug(String logMsg);
同样
Alt+Enter,应该会在
Face.cpp文件中自动添加该方法的相关代码
至此,可以删除之前的临时方法 ndkTmp 的相关代码,包括在
FaceHelper.java中的声明,和在
Face.cpp中的实现
添加相关头文件、完成 logDebug 方法,将
JNIEXPORT的方法都加入到
extern "C"中
#include <jni.h> #include <string> #include <android/log.h> #define LOG_TAG "Andy/FaceCPP" #define LOGD(...) ((void)__android_log_print(ANDROID_LOG_DEBUG, LOG_TAG, __VA_ARGS__)) using namespace std; extern "C" { JNIEXPORT void JNICALL Java_andy_studentingeo_FaceHelper_logDebug(JNIEnv *env, jclass type, jstring logMsg_) { const char *logMsg = env->GetStringUTFChars(logMsg_, 0); string stdLogMsg(logMsg); //转换成 std 的类型,方便操作 LOGD(stdLogMsg.c_str()); //在 logcat 中打 log env->ReleaseStringUTFChars(logMsg_, logMsg); } }
现在可以在 MainActivity 的 onCreate 方法中调用该方法来测试了:
FaceHelper.logDebug("Hello NDK");
运行之后,在 logcat 中捕捉到我们设定的 log:
至此,环境搭建完成。往后需要添加方法的时候,可以在 FaceHelper.java 中声明,然后 Alt+Enter 自动完成,接着去 Face.cpp 中把生成的方法代码移动到
extern "C"中,最后具体实现即可。
若本文对你有帮助,请扫描左边的二维码;若本文对你没有帮助,请扫描右边的二维码。谢谢客官。
目前已有 7 人因为本文获得帮助并表达谢意,已有 2 人表示虽然没有帮助但是仍然表示感谢。
相关文章推荐
- SourceProvider.getJniDirectories
- 执行失败的任务 ': processDebugManifest'
- Android Studio使用教程(六):Gradle多渠道打包
- Android客户端程序Gradle如何打包
- Android Studio注释模板介绍
- Android Studio使用教程(四):Gradle基础
- Android Studio使用教程(五):Gradle命令详解和导入第三方包
- Win7安装gradle
- mac gradle 安装
- 关于Android Studio 和 Gradle的那些事儿
- Gradle这个黑盒子
- 收藏各种技术源码
- maven用户试用gradle
- 用Gradle 构建你的android程序
- 用Gradle 构建你的android程序-依赖管理篇
- Gradle 构建 android 应用常见问题解决指南
- Adnroid Studio Gradle 多渠道打包
- Gradle,构建工具的未来?
- Android Studio 使用 Gradle 打包 Jar-IT蓝豹
- Install Android Studio in Ubuntu 16.04 LTS