2017年Android Studio做NDK情况调查

来源:互联网 发布:协同工作软件 编辑:程序博客网 时间:2024/06/07 02:43

最近在做把C++移植Android Studio的工作,上网查询发现一大堆不同的方法,让人感到迷茫,归其原因是AS改版太迅速了,之前的方法刚推出没多久就过时了,相关的书籍

《Android NDK Beginner’s Guide-2012.pdf》
《Android 4_0 NDK程式设计-2012.pdf》
《Pro Android Apps Performance Optimization-2012.pdf》
《Android C++高级编程:使用NDK_Onur Cinar, 于红-2014》(中文版的Pro Android Apps Performance Optimization)

2012年时发布了一大批eclipse上使用.mk方法进行交叉编译的教程,还出了一个SWIG专门用来进行语言转化。
可到2016年,google出了一个新的AS版本,直接开始使用CMake,并开始摒弃使用ndk-build,这下eclipse也开始用得少了,原有的教程不适用了。
以下是相关的建立NDK方法:


参考http://www.jianshu.com/p/e689d0196a17

使用android.mk,application.mk + ndk-build方法,

1、建立jni文件夹,建立自己的新类。
2、修改app下的build.gradle文件

android{
……
defaultConfig{
……
ndk{
moduleName “MyLibrary”
abiFilters “armeabi”,”armeabi-v7a”
}
sourceSets.main{
jni.srcDirs = []
jniLibs.srcDir “src/main/libs”
}
}
externalNativeBuild {
ndkBuild {
path “src/main/jni/Android.mk”
}
}
……

3、修改gradle.properties文件

android.useDeprecatedNdk=true

4、通过命令台或external-tools使用javah在jni文件夹内生成.h文件。
5、在jni目录下分别编写Android.mk、Application.mk、自己的native库.cpp这三个文件,使用ndk-build在libs文件夹内生成.so文件。
6、直接MainActivity调用native方法即可。


参考http://www.jianshu.com/p/7844aafe897d

实验性gradle版本方法:

1、首先将gradle版本调整为实验性版本。修改
Gradle_Experimental_NDK/gradle/wrapper下的gradle-wrapper.properties文件:

distributionUrl=https://services.gradle.org/distributions/gradle-2.10-all.zip

2、打开Gradle_Experimental_NDK目录下的build.gradle文件,如下图进行配置:

classpath “com.android.tools.build:gradle-experimental:0.6.0- beta 5”

3、打开app目录下的build.gradle,进行配置:

apply plugin: ‘com.android.model.application’

4.创建jni目录,新建类,这个时候,由于实验性Gradle的特性,你可以直接在native 的新建方法上按 “alt + Enter”就能新建 相应的.c文件。
5、直接在mainActivity中调用新建类的native方法即可。


参考http://www.jianshu.com/p/18724f29d30e
https://developer.android.com/studio/projects/add-native-code.html#build-run-sample

使用CMakelists.txt方法,此也是目前官方推荐方法

1、新建项目时勾选 Include C++ Support。
2、所有的C++源文件就放在cpp文件夹下,相应的CMakeLists.txt中则说明如何编译它们。
3、build.gradle文件中已在2处自动添加

externalNativeBuild {
cmake {
….
}
}

4、程序可以直接运行即可。
程序生成的.so文件在 ‘…\app\build\intermediates\cmake\debug\obj’ 路径下,
生成的apk文件在 ‘…\app\build\outputs\apk’ 路径下。


由以上发展趋势可见,google可能会逐渐加强CMake和Gradle的功能,故大家只要重点学习CMake方法即可。


参考:http://blog.csdn.net/zxx20145/article/details/53020964

使用CMake编译OpenCV进行NDK开发

就以在Android中进行opencv开发为例,
1、先下载《OpenCV-****-android-sdk》的安装包,解压后发现其路径“….\OpenCV-2.4.10-android-sdk\sdk\native\jni”路径下有许多.cmake文件吧,就可以直接在CMake中链接这些文件就能进行编译了(CMake的工作原理)。
2、新建AS项目Include C++,然后修改其CMake.txt文件(4处添加):

cmake_minimum_required(VERSION 3.4.1)set(OpenCV_STATIC ON)#添加1处set(OpenCV_DIR D:/OpenCV/cv2411/OpenCV-2.4.10-android-sdk/sdk/native/jni)#添加2处find_package(OpenCV REQUIRED)#添加3处add_library( ..... )#将你将编写的.cpp文件生成库文件find_library( ....)#导入NDK库文件target_link_libraries( # Specifies the target library.                       native-lib                       # Links the target library to the log library                       # included in the NDK.                       ${log-lib} ${OpenCV_LIBS})#添加4处                       #将NDK、OpenCV库文件与你编写的库文件链接起来。

3、修改app的build.gradle文件,添加2处。

android {    compileSdkVersion 25    buildToolsVersion "26.0.1"    defaultConfig {        applicationId "com.example.mycameraopen"        minSdkVersion 21        targetSdkVersion 25        versionCode 1        versionName "1.0"        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"        externalNativeBuild {#添加1处            cmake {                cppFlags "-frtti -fexceptions"                abiFilters 'x86','armeabi-v7a'            }        }    }    buildTypes {        release {            minifyEnabled false            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'        }    }    externalNativeBuild {#添加2处        cmake {            path "CMakeLists.txt"        }    }}

4、在main/cpp文件夹下修改你的.cpp文件建立Native方法,并在调用你的native方法的java类中添加

static {        System.loadLibrary("native-lib"); #以native-lib为例子    }public static native int[] getGrayImage(int[] pixels, int w, int h); #以getGrayImage为例子

然后就能像正常函数一样使用你的native方法了。

注意在建立.cpp文件时,要使用JNI语法,主要是在 函数名声明、数据类型与C++语法稍有不同,具体可参考《JNI完全手册》、《JNI程序员指南与规范》。

5、只要SDK Manager中加载了LLDB模块,就可在cpp文件中直接设置断点进行调试啦,跟VS调试一样,但是,目前该调试只能在模拟器上运行成功。如果在手机上调试,则只能调试Java部分,不能调试cpp部分。


Android Studio使用Cmake进行NDK开发的流程主要为:

Created with Raphaël 2.1.0编写cpp文件修改CMakeCMake生成.so静态库文件Java调用.so静态库文件获取方法运行调试
原创粉丝点击