之前寫過一篇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
com_byl_jnitest_MainActivity.h:
/* 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
jnitest.c:
#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");
}
注意:.so最終的名稱默認爲lib+項目名如:libjnitest.so。
步驟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"
}
運行結果: