参考链接:Android 使用NDK编译二进制文件并运行
http://blog.csdn.net/u014088294/article/details/49924967
首先,新建jni文件夹。
然后,编写.c和.mk文件。
.c文件具体如下
#include <stdio.h>
intcount = 0;
void sevenWeapons(int number)
{
char* str ="Hello,11111111!";
printf("%s %d\n",str,number);
}
int main()
{
while(1)
{
sevenWeapons(count);
count++;
sleep(1);
}
return 0;
}
mk文件如下所示。
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := target
LOCAL_SRC_FILES := target.c
include $(BUILD_EXECUTABLE)
可以用编译命令生成,也可以使用gradle去生成。
android ndk编译命令
http://www.jianshu.com/p/3eb1539fdcdc
这里由于我不知道怎么配置生成所以的平台的target文件,所以还是用的gradle去生成可执行文件。
配置gradle。其实这个配置和生成so文件的配置是一样的。
sourceSets.main{
jni.srcDirs = []
jniLibs.srcDirs = ['src/main/jniLibs']//设置目标的存放路径
}
task ndkBuild(type:Exec,description:'Compile JNI source via NDK'){
commandLine"C:\\Users\\lei\\AppData\\Local\\Android\\Sdk\\ndk-bundle\\ndk-build.cmd",
//配置ndk的路径
'NDK_PROJECT_PATH=build/intermediates/ndk',
//ndk默认的生成文件
'NDK_LIBS_OUT=src/main/jniLibs',
//配置的我们想要生成的文件所在的位置
'APP_BUILD_SCRIPT=src/main/jni/Android.mk'
//指定项目以这个mk的方式
}
tasks.withType(JavaCompile){
//使用ndkBuild
compileTask ->compileTask.dependsOn ndkBuild
}
整体配置如下:
android {
compileSdkVersion 26
buildToolsVersion "26.0.1"
defaultConfig {
applicationId "com.demo.mkdemo"
minSdkVersion 19
targetSdkVersion 26
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'),'proguard-rules.pro'
}
}
sourceSets.main{
jni.srcDirs = []
jniLibs.srcDirs = ['src/main/jniLibs']//设置目标的so存放路径
}
task ndkBuild(type:Exec,description:'Compile JNI source via NDK'){
commandLine"C:\\Users\\lei\\AppData\\Local\\Android\\Sdk\\ndk-bundle\\ndk-build.cmd",
//配置ndk的路径
'NDK_PROJECT_PATH=build/intermediates/ndk',
//ndk默认的生成文件
'NDK_LIBS_OUT=src/main/jniLibs',
//配置的我们想要生成的so文件所在的位置
'APP_BUILD_SCRIPT=src/main/jni/Android.mk'
//指定项目以这个mk的方式
}
tasks.withType(JavaCompile){
//使用ndkBuild
compileTask ->compileTask.dependsOn ndkBuild
}
}
dependencies {
compile fileTree(dir:'libs',include: ['*.jar'])
.......
}
将这个push到android设备中。
先将target文件copy至adb所在目录下,即C:\Users\lei。
将生成的二进制文件push到android设备中。
adb push target /data/local/tmp
注意,Android的有些目录是无法执行二进制文件的,所以一般放在/data/local/tmp目录中。
执行二进制文件
C:\Users\lei>adb shell
root@rk3188:/ # cd /data/local/tmp
//赋予权限
root@rk3188:/data/local/tmp # chmod 751 target
// ./target执行二进制文件
root@rk3188:/data/local/tmp # ./target
结果如下:
成功执行了。