1. 如果是新建一个项目就需要勾选 那个include c++
2.如果是以前的项目就需要如下设置了
2.1 .先写一个demo测试一下:
新建一个方法,用native修饰方法返回类型前面:
如:public nativeStringgetStrFromC();
如果是kotlin写法如下:
: val strFromC: String external get //可以写一个方法形式:external funmyDate(x: Int): Double 、
2.2:,接着需要根据java 的native方法,使用javah工具类生成native的头文件,
进入java目录执行如下命令
javah -d ../jni packageName.className
例如:
javah -d ../jni com.dremap.okhttpdemo.NdkJniUtils
2.3:,生成了头文件后,开始自己写c/c++了,目录可以随意的,但是是以项目的modu当前根目录为主目录的;
先在根目录下新建一个目录:如下
新建的目录名称可以随意,jni,cpp都可以,因为后面会讲一个配置,
接着就将jni拷贝到该目录下,然后新建一个c/c++实现的源码文件,导入相关头文件。
2.4: 然后再新建一个CMakeLists.txt文件,放到以根目录为相对目录的任意位置即可,都可以配置的;
然后写入的内容如下:
cmake_minimum_required(VERSION 3.4.1) #引入的版本号,如果不知道当前自己的,可以新建一个demo,然后查看即可;
add_library( myLib #生成的动态库名称
SHARED #生成shared库
src/main/jni/mymain.c ) # 这一步开始制定你的原代码的地方了,如果有多个可以空格隔开,或者换行,
find_library( myLib #要查找的动态库名,和上面的add_library的名称保持一致
log ) # 引入log库;
target_link_libraries( # Specifies the target library.
myLib #链接的库名称,和上面的add_library名称一致;
${log-lib} ) #将log的库也链接进来;
2.5, 开始配置cmake文件的位置了,
deftmpClosure = {String str -> println str}
defSuperViewVersion ='25.3.1'
android {
tmpClosure("This is a Closure2---------------/////////\\\\\\")
compileSdkVersion25
defaultConfig {
tmpClosure("This is a Closure3---------------/////////\\\\\\")
applicationId"com.xh.openui"
minSdkVersion19
targetSdkVersion22
versionCode1
versionName"1.0"
externalNativeBuild {
tmpClosure("This is a Closure4---------------/////////\\\\\\")
cmake {
tmpClosure("This is a Closure5---------------/////////\\\\\\")
cppFlags"-fexceptions"
abiFilters"armeabi","x86"
}
}
ndk{
//moduleName"myLib"
//ldLibs"log","z","m"
abiFilters"armeabi","x86"
}
}
/*sourceSets.main {
jniLibs.srcDir 'libs'
}*/
buildTypes {
release {
minifyEnabledfalse
proguardFiles getDefaultProguardFile('proguard-android.txt'),'proguard-rules.pro'
}
}
tmpClosure("This is a Closure6---------------/////////\\\\\\")
externalNativeBuild {
cmake {
path"CMakeLists.txt"
}
}
}
以上为android节点下的配置,tmpClosure为基于Groovy语言自定义的DSL脚本闭包函数,用来打印日志信息;
2.6 ,开始编译,一般还会有问题,有几处需要配置一下,
项目的proj目录下的gradle.properties 需要配置一行 android.useDeprecatedNdk=true #允许使用旧版本的ndk
还需要注意 proj目录下的local.properties 文件配置,
配置sdk和ndk,
ndk.dir=E\:\\AndroidSDK_NEW_150724\\ndkr10\\android-ndk-r12b
sdk.dir=E\:\\AndroidSDK_NEW_150724\\sdk
注意随着cmake的升级,ndk也需要升级,目前用的cmake是3.6.3155560的
ndk用的是12的,LLDB版本是2.3的;
然后执行编译就可以成功了,如果有错误,请检查以上配置,
编译完成后会在\.externalNativeBuild\cmake\debug\armeabi\CMakeFiles\myLib.dir\src\main\jni路径下生产中间连接的产物.o文件,
在项目的modu的\myOpengles\build\intermediates\cmake\debug目录下将生成最终的各个cpu架构的动态库或者静态库,这时候的普通工程改造就完成了,有的步骤可以使用ided的辅助功能更简单的完成。比如:
这样去指定要编译的cmke的CMakeLists.txt,或者ndkbuild的Android.mk文件;
可以帮你手动在module中的gradle配置,
#还有如debug开启:
debug {
jniDebuggable true
}
,当然会遇到很多问题,多沟通交流就可以解决,比如百度,谷歌也可以的;
网友评论