AndroidStudio如何快速製作.so

  之前寫過一篇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"
        }
運行結果:



發佈了101 篇原創文章 · 獲贊 492 · 訪問量 44萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章