Android Studio開發JNI工程,androidjni

來源:互聯網
上載者:User

Android Studio開發JNI工程,androidjni

使用Android Sutdio建立一個新的工程後,接下來記錄建立NDK工程的基本步驟。
本文將達到:1. 建立NDK工程2. 在JNI中輸出Log語句3. 指定編譯的so庫的abi版本4. 解決在建立NDK工程中的問題
Step: 1. 添加native介面注意寫好native介面和System.loadLibrary()即可了,並無特別之處。P.S:onCreate()中對R.id.txt執行setText(),所以這裡需要對xml布局檔案按正常的開發步驟進行修改即可。
直接給出代碼如下:
public class MainActivity extends Activity{    static {        System.loadLibrary("JniTest");    }       public native String getStringFromNative();    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        TextView txtView = (TextView) findViewById(R.id.txt);        txtView.setText(getStringFromNative());    }}



Step: 2.執行Build->Make Project


這一步驟執行一下,驗證工程中並無其它錯誤,並對工程進行了編譯,產生了.class檔案..class檔案的產生路徑是在 app_path/build/intermediates/classes/debug下的.如:


Step: 3.javah產生c標頭檔

點擊"View->Tool Windows->Terminal",即在Studio中進行終端命令列工具.執行如下命令產生c語言標頭檔。這裡需要注意的是要進入 <Project>\app\src\main的目錄下執行javah命令,為的是產生的 .h 檔案同樣是在<Project>\app\src\main路徑下,可以在Studio的工程結構中直接看到。
操作命令:javah -d jni -classpath <SDK_android.jar>;<APP_classes> lab.sodino.jnitest.MainActivity具體操作圖如下:

javah -d jni -classpath c:\Users\sodinochen\AppData\Local\Android\sdk\platforms\android-16\android.jar;..\..\build\intermediates\classes\debug lab.sodino.jnitest.MainActivity


對於"主要版本51比50新,此編譯器支援最新的主要版本"則是由於電腦上安裝了兩個版本的jdk引起的,而當前使用的是舊的jdk。把舊的jdk刪除,並執行java version命令後顯示當前jdk為最新的1.7時,則不會再有此提示了。如:

最後的產生結果:




Step: 4.編輯c檔案

在main.c檔案中實現標頭檔中的方法,具體功能為直接return回一個String,並且使用android_log列印出相關日誌。代碼如下:
/* DO NOT EDIT THIS FILE - it is machine generated */#include <jni.h>#include <android/log.h>#ifndef LOG_TAG#define LOG_TAG "ANDROID_LAB"#define LOGE(...) __android_log_print(ANDROID_LOG_ERROR, LOG_TAG, __VA_ARGS__)#endif/* Header for class lab_sodino_jnitest_MainActivity */#ifndef _Included_lab_sodino_jnitest_MainActivity#define _Included_lab_sodino_jnitest_MainActivity#ifdef __cplusplusextern "C" {#endif/* * Class: lab_sodino_jnitest_MainActivity * Method: getStringFromNative * Signature: ()Ljava/lang/String; */JNIEXPORT jstring JNICALL Java_lab_sodino_jnitest_MainActivity_getStringFromNative  (JNIEnv * env, jobject jObj){      LOGE("log string from ndk.");      return (*env)->NewStringUTF(env,"Hello From JNI!");  }#ifdef __cplusplus}#endif#endif

到這裡後,我們再執行一個"Build->Make Project",發現"Messages Gradle Build"會給出提示如下:
Error:Execution failed for task ':app:compileDebugNdk'. > NDK not configured. Download the NDK from http://developer.android.com/tools/sdk/ndk/.Then add ndk.dir=path/to/ndk in local.properties. (On Windows, make sure you escape backslashes, e.g. C:\\ndk rather than C:\ndk)
這裡提示了NDK未配置,並且需要在工程中的local.properties檔案中配置NDK路徑。好了,提示很清楚了,那我們就進入下一步吧。

Step: 5.配置NDK這一步包括兩個動作:1.指明ndk路徑
2. 修改build.gradle配置    工程中共有兩個build.gradle設定檔,我們要修改的是在<Project>\app\build.gradle這個檔案。為其在defaultConfig分支中增加上
    ndk {        moduleName "JniTest"        ldLibs "log", "z", "m"        abiFilters "armeabi", "armeabi-v7a", "x86"    }
    以上配置代碼指定的so庫名稱為JniTest,連結時使用到的庫,對應android.mk檔案中的LOCAL_LDLIBS,及最終輸出指定三種abi體繫結構下的so庫。添加後如:
這時,再執行"Build->Rebuild Project",就可以編譯出so檔案了。但在Window平台上會出現一個問題:
Error:Execution failed for task ':app:compileDebugNdk'.> com.android.ide.common.internal.LoggedErrorException: Failed to run command: D:\Mission\adt-bundle-windows\ndk-r10b\ndk-build.cmd NDK_PROJECT_PATH=null APP_BUILD_SCRIPT=C:\Users\sodinochen\AndroidstudioProjects\JniTest2\app\build\intermediates\ndk\debug\Android.mk APP_PLATFORM=android-21 NDK_OUT=C:\Users\sodinochen\AndroidstudioProjects\JniTest2\app\build\intermediates\ndk\debug\obj NDK_LIBS_OUT=C:\Users\sodinochen\AndroidstudioProjects\JniTest2\app\build\intermediates\ndk\debug\lib APP_ABI=armeabi,armeabi-v7a,x86Error Code: 2Output: make.exe: *** No rule to make target `C:\Users\sodinochen\AndroidstudioProjects\JniTest2\app\build\intermediates\ndk\debug\obj/local/armeabi/objs/JniTest/C_\Users\sodinochen\AndroidstudioProjects\JniTest2\app\src\main\jni', needed by `C:\Users\sodinochen\AndroidstudioProjects\JniTest2\app\build\intermediates\ndk\debug\obj/local/armeabi/objs/JniTest/C_\Users\sodinochen\AndroidstudioProjects\JniTest2\app\src\main\jni\main.o'. Stop.
出現這個錯誤很莫名其妙..幾番折騰下,找到一個視頻出來了大概原因及解決方式:出處見Youtube視頻 02:50分開始:https://www.youtube.com/watch?v=okLKfxfbz40#t=362在Windows下NDK一個bug,當僅僅編譯一個檔案時出現會出現此問題,解決方案就是再加入一個空util.c檔案即可。編譯出來的庫檔案被Studio輸出到了的路徑中




Step: 6.安裝運行

介面:


查看Log列印:


聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.