俗语有云:
地转天旋,万事开头难。斗霜傲雪二十年,堂堂剑气尚寒。戎马倥偬一生,多少失败成功?试看大千世界,依旧海阔天空。
网上看了各种NDK开发的入门教程,要么编译不通过,要么就过时了,总之各种各样的问题;这里小编简单写一下NDK入门开发的demo,方便同学参考学习,如有不足之处还请多多指正。
1,开发环境AS3.0以上版本;cmakelists编译
2,在AS上新建一个Android Project(工程),不要勾选
然后next,finish();
3,在main目录下新建cpp文件夹,在cpp文件夹下s新建.c文件或者.cpp文件。
cpp_file.png
内容如下:
#include <jni.h>
//JNIEXPORT jint JNICALL
//
//Java_com_town_dell_andk6_JNI_getInt//com.town.dell.andk6
//
//(JNIEnv *env, jobject jobj){
//
// return 3;
//
//}
JNIEXPORT jstring JNICALL
Java_com_town_dell_andk6_JNI_getString//com.town.dell.andk6
(JNIEnv *env, jobject jobj){
return (*env)->NewStringUTF(env, "I am from C .");
}
4,将CMakeLists.txt文件复制到app目录下或者新建一个CMakeLists.txt,内容如下:
add_library(
jni_demo
SHARED
src/main/cpp/jni_demo.c )
find_library( # Sets the name of the path variable.
log-lib
log )
target_link_libraries( # Specifies the target library.
jni_demo
${log-lib} )
其中jni_demo是库文件名,是JNI类的System.loadLibrary("jni_demo");中的jni_demo;
5,然后在app.gradle文件里面的android的defaultConfig目录下配置:
externalNativeBuild {
cmake {
cppFlags ""
}
}
在android下配置:
externalNativeBuild {
cmake {
path "CMakeLists.txt"
}
}
如图:
gradle_config.png
6,然后更新gradle,更新gradle之后,rebuild project,然后在build的目录下就会生成so文件。
build_so.png
7,然后在MainActivity里面测试如图:
ndk_test.png
至此NDK的Demo已完成;
8,记录如何在别的project中使用so文件
apply plugin: 'com.android.library'
android {
compileSdkVersion 26
buildToolsVersion "26.0.1"
defaultConfig {
// applicationId "com.demo.cmaketestdemo"
minSdkVersion 19
targetSdkVersion 26
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
externalNativeBuild {
cmake {
cppFlags ""
}
}
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
externalNativeBuild {
cmake {
path "CMakeLists.txt"
}
}
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
exclude group: 'com.android.support', module: 'support-annotations'
})
compile 'com.android.support:appcompat-v7:26.+'
compile 'com.android.support.constraint:constraint-layout:1.0.2'
testCompile 'junit:junit:4.12'
}
task makeJar(type: Copy) {
//删除存在的
delete 'build/libs/jni.jar'
//设置拷贝的文件
from('build/intermediates/bundles/default/')
//打进jar包后的文件目录
into('build/libs/')
//将classes.jar放入build/libs/目录下
//include ,exclude参数来设置过滤
//(我们只关心classes.jar这个文件)
include('classes.jar')
//重命名
rename ('classes.jar', 'jni.jar')
}
makeJar.dependsOn(build)
修改后sync gradle一下。然后打开右边的gradle命令栏。
找到other中的makeJar命令。鼠标左键双击。这个界面就弹出来了
在terminal窗口下输入gradlew makeJar
D:\AndroidStudio\CMakeTestDemo>
D:\AndroidStudio\CMakeTestDemo>gradlew makeJar
下面开始 在新的project中使用。
①在src目录下新建jniLibs文件夹,并将之前生成的so文件拷进去。
2,在app.gradle的Android{}里面配置gradle
sourceSets {
main {
jniLibs.srcDirs = ['src/jniLibs'];
}
}
②将jni.jar赋值到libs目录下(libs是默认存在的)。
然后添加depend。
点击ok,然后就可以了。
网友评论