之前写过一篇Eclipse制作.so的文章,http://blog.csdn.net/baiyuliang2013/article/details/44306921使用的是GNUstep模拟Linux环境,过程现在看来是想相当麻烦,后来发现一个简单的方法就是通过项目右键添加Native Supprot...可以快速创建.so而不使用命令行,
由于AS越来越被大家使用,所以Eclipse的制作过程就不再写了,这篇主要讲的是如何用AS快速制作一个简单的.so文件!
如果之前对制作.so一点了解也没有的话,在看这一篇之前可以看下文章开头提到的文章,会对这篇文章的理解上有所帮助,因为本篇文章不打算讲解的太过详细!
步骤1:
创建一个新的AS项目(模板选择EmptyActivity即可)jnitest,包名:com.byl.jnitest:
步骤2:
添加NDK支持:
按Ctrl+Alt+Shift+S,出现如图:
ok,完成后,打开项目根目录下的local.properties文件:
ndk的路径会自动添加进来,表示操作成功!
步骤3:
打开根目录下gradle.properties文件,添加代码:
android.useDeprecatedNdk=true
步骤4:
项目>app>src>main文件夹下,新建jni文件夹,并放入三个文件.h、.c、.c:
注意:
.h文件命名的命名方式,包名+调用.so的Activity名且"."需要更换成下滑线"_";
jnitest.c的命名可以随便定义;
util.c是一个空的.c文件,作用就是在ndk编译时避免一个错误:
make.exe: *** No rule to make target
/* DO NOT EDIT THIS FILE - it is machine generated */ #include <jni.h> /* Header for class com_byl_jnitest_MainActivity */ #ifndef _Included_com_byl_jnitest_MainActivity #define _Included_com_byl_jnitest_MainActivity #ifdef __cplusplus extern "C" { #endif /* * Class: com_byl_jnitest_MainActivity * Method: getSec * Signature: ()Ljava/lang/String; */ JNIEXPORT jstring JNICALL Java_com_byl_jnitest_MainActivity_getSec (JNIEnv *, jclass); #ifdef __cplusplus } #endif #endif
#include <string.h> #include <jni.h> jstring Java_com_byl_jnitest_MainActivity_getSec (JNIEnv* env,jobject thiz){ return (*env)->NewStringUTF(env,"调用jni成功"); }
步骤5:
在MainActivity中调用.so:
public static native String getSec();//.so中的方法名 static{ System.loadLibrary("jnitest"); }
步骤6:
最后一步,打开app目录下build.gradle(注意是app目录下而不是根目录下)文件,修改gradle配置:
defaultConfig { applicationId "com.byl.jnitest" minSdkVersion 14 targetSdkVersion 23 versionCode 1 versionName "1.0" ndk { moduleName "jnitest" ldLibs "log", "z", "m" abiFilters "armeabi" } }
以上步骤全部完成后,直接点击run>>:
运行必然要报错的,因为之前.so文件并不存在,经此一调,ndk便自动为我们生成了想要的东西:
将.so文件复制出来,然后在main文件夹下建立jniLibs/armeabi,并将.so放入:
再次运行>>:
此例只是简单的输出一个字符串,一般的项目放入一个不想外露的密钥之类的还是非常有用的!
另:多种cpu类型,可在abiFilters后添加cpu类型即可,如:
ndk { moduleName "jnitest" ldLibs "log", "z", "m" abiFilters "armeabi","x86" }运行结果: