先说明一下,这种方式并不实用于全部情况,只是我自己使用的时候,这种方式成功了,所以记录一下
1:创建一个类useNdk(随意写)
public class useNdk {
static {
System.loadLibrary("useNdk");
}
public native static int getMsg(int num);
}
这里System.loadLibrary("useNdk");的useNdk是你要编译成so包的名字,getMsg是调用c的方法,生成的so包名字是libuseNdk.so
然后点击Android Studio顶部的Build->Make Project
会在app/build/intermediates/classes/debug下面自动创建class类,比如
创建过后就要手动执行命令生成.h文件
先要cd到debug目录,然后执行:javah -d jni -classpath . 报名+类名
比如我的:D:\android\workspace\doorctrl\doorctrl\app\build\intermediates\classes\debug>javah -d jni -classpath . com.ll.useNdk
不要放过任何一个细节,-classpath后面是空格,然后是点,然后是空格,然后是包名类名
成功的话会在intermediates下生成jni文件夹,里面有.h文件
在src/main下面创建jni文件夹,或者吧上面的jni文件夹copy过来
然后创建.c文件
随便写的一个,主要是#include<com_ll_usendk.h>,引用.h文件,未了能让java调用到.c文件里面的方法
到这里.h文件和.c文件就弄好了,现在就编译
现在build.gradle中添加
ndk {
moduleName "useNdk"//生成文件名
cFlags "-DANDROID_NDK -D_RELEASE"//这个对应生成模式
ldLibs "m","log","jnigraphics"//这个对应LOCAL_LDLIBS但是需要去掉前面的 "l"
abiFilters "armeabi-v7a", "arm64-v8a", "x86","x86_64"//对应app的api
stl "stlport_shared"//对应app_stl
}
和
sourceSets { main { jni.srcDirs= ['src/main/jni','src/main/jni'] } }
externalNativeBuild {
ndkBuild {
path 'build/intermediates/ndk/debug/Android.mk'
}
}
ndk添加在defaultConfig下面
sourceSets和externalNativeBuild与defaultConfig同级的
然后cd到jni目录下,就是src/main/jni
然后执行ndk-build
这样就会在main目录下生成lib文件夹,也有可能会多生成一个obj文件夹,不管他
lib里面的东西就是你想要的so文件了
然后吧lib文件里的东西copy到你想要放的地方就ok了
基本就这些流程了,有些还是比较坑,我也有些地方没有说明白,有什么不懂的可以留言
网友评论