Android studio1.5.1 NDK配置開發

來源:互聯網
上載者:User

Android studio1.5.1 NDK配置開發

注意:因為使用的工具和SDK版本不同,過程可能就不同,我把我實驗過的幾種情況都會說下。

一、工具和SDK版本:Android studio1.51, SDK版本:23 (最新的6.0)

二、工具和SDK版本:Android studio1.51, SDK版本:21

在這兩種情況之前你必須做好一件事:安裝NDK。過程如下:

在setting 中appearance -> Android SDK -> SDK Tools -> Android NDk 打鉤,然後點擊apply -> OK. 如:

自動安裝好DN卡之後,會在local.properties 中有顯示:如

到此ND就安裝完成了,那麼接下來就是關鍵時刻了,先來看看情況一的具體過程:

1. 建立一個工程,就是一個簡單的空白工程,功能也沒有

2. 定義native 介面 和 載入即將產生的庫。就幾行代碼,代碼如下:

  • packagezhanghuan.cn.jnitest1;
  • importandroid.support.v7.app.AppCompatActivity;importandroid.os.Bundle;
  • importandroid.widget.TextView;
  • publicclassMainActivityextendsAppCompatActivity{static{
  • System.loadLibrary("JniTest");}
  • publicnativeStringgetStringFromNative();
  • @Override
  • protectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);
  • setContentView(R.layout.activity_main);
  • TextViewtextView=(TextView)findViewById(R.id.text);textView.setText(getStringFromNative());//調用介面
  • }}
    3. 寫好介面之後接下來就是關鍵了,點擊 Build -> Make Project, 如:

    然後在底部的狀態列Messages 中查看Build的情況,必須是0錯誤才行,如:

    4. Build 成功之後,就在Terminal 命令列中開始產生.h 檔案

    命令為:

  • javah-djni-classpathD:\tools\android-sdk\platforms\android-23\android.jar;D:\MyProject\AndroidStudio\JniTest1\app\src\main\javazhanghuan.cn.jnitest1.MainActivity

    就是這一步卡了我好久,之前找的教程每個的命令都是這樣的:

  • javah-djni-classpathD:\tools\android-sdk\platforms\android.jar;..\..\build\intermediates\classes\debugzhanghuan.cn.jnitest1.MainActivity

    結果報錯 “找不到android.support.v7.app.AppCompatActivity的類檔案” 如:

     

    怎麼試都不成功,最後發現除非不用V7特性,不繼承AppCompatActivity 類,繼承成普通的Activity就沒事,這其中的差異我在後面會說的。但是我想如果在AppCompatActivity不應該不行的,雖然這是新特性,但它肯定能包容以前的。既然在debug 這中找不到,那我就直接在main 中指定類檔案,不在debug中找了,結果讓我發現居然成功了!當時心裡呼了好長的一口氣。成功的命令就是上面的第一個命令,直接指向類檔案,然後產生了.h 檔案,但是這個.h 檔案和用debug 中的類檔案產生的.h 檔案是有區別的,這個區別待會在後面把.h 檔案一對比就知道了。

    迴歸正題,命令成功之後,在main 目錄下回產生jni目錄,然後還有一個.h 檔案:如:

     

    我貼下.h 檔案的代碼:

  • /*DONOTEDITTHISFILE-itismachinegenerated*/#include
  • /*Headerforclasszhanghuan_cn_jnitest1_MainActivity*/
  • #ifndef_Included_zhanghuan_cn_jnitest1_MainActivity#define_Included_zhanghuan_cn_jnitest1_MainActivity
  • #ifdef__cplusplusextern"C"{
  • #endif/*
  • *Class:zhanghuan_cn_jnitest1_MainActivity*Method:getStringFromNative
  • *Signature:()Ljava/lang/String;*/
  • JNIEXPORTjstringJNICALLJava_zhanghuan_cn_jnitest1_MainActivity_getStringFromNative(JNIEnv*,jobject);
  • #ifdef__cplusplus
  • }#endif
  • #endif 5. 複製.h 檔案放在相同的目錄下,改個名稱(名字任意)為my.c , 代碼如下:
  • #include"zhanghuan_cn_jnitest1_MainActivity.h"
  • JNIEXPORTjstringJNICALLJava_zhanghuan_cn_jnitest1_MainActivity_getStringFromNative(JNIEnv*env,jobjectjob){
  • return(*env)->NewStringUTF(env,"HelloformJNI!");}
    但是這時你會發現有錯誤,NDK support is an experimental feature and all use cases are not yet supported, 如:

    解決方案是在gradle.properties 檔案中加入一句代碼:

  • android.useDeprecatedNdk=true

     

    6. 在app 中的build.gradle 檔案的defaultConfig 中加入NDK配置,指定產生的so檔案名稱和適配的arm 類型. 加入代碼:
  • ndk{moduleName"JniTest"
  • abiFilters"armeabi","armeabi-v7a","x86"} 我的build.gradle 檔案代碼如下:
  • applyplugin:'com.android.application'
  • android{compileSdkVersion23
  • buildToolsVersion"23.0.2"
  • defaultConfig{applicationId"zhanghuan.cn.jnitest1"
  • minSdkVersion11targetSdkVersion23
  • versionCode1versionName"1.0"
  • ndk{
  • moduleName"JniTest"abiFilters"armeabi","armeabi-v7a","x86"
  • }}
  • buildTypes{release{
  • minifyEnabledfalseproguardFilesgetDefaultProguardFile('proguard-android.txt'),'proguard-rules.pro'
  • }}
  • }
  • dependencies{compilefileTree(dir:'libs',include:['*.jar'])
  • testCompile'junit:junit:4.12'compile'com.android.support:appcompat-v7:23.2.1'
  • }
    到此,基本步驟就全部完成了,然後就直接運行一下,看下效果,如下:


    成功完成!如果有興趣可以看下下面的第二種情況。

     

    好了,接下來我們就看看第二種情況:不使用V7。

    1. 前面的幾步步驟和第一種情況是一樣的,到第4步的命令列開始有重要的差別, 我就直接跳到命令列那步了,命令如下:

  • javah-djni-classpathD:\tools\android-sdk\platforms\android-21\android.jar;D:\MyProject\AndroidStudio\JinTest\app\build\intermediates\classes\debugzhanghuan.cn.jintest.MainActivity

    注意如果出錯要寫絕對的地址,網上的教程都是什麼”..\..\buidl\...“這種寫法,但是我一次都沒成功,折騰了很久都沒成功,如果你成功了就請告訴我。

    最後產生的.h 檔案代碼如下:

  • /*DONOTEDITTHISFILE-itismachinegenerated*/#include
  • /*Headerforclasszhanghuan_cn_jintest_MainActivity*/
  • #ifndef_Included_zhanghuan_cn_jintest_MainActivity#define_Included_zhanghuan_cn_jintest_MainActivity
  • #ifdef__cplusplusextern"C"{
  • #endif#undefzhanghuan_cn_jintest_MainActivity_BIND_ABOVE_CLIENT
  • #definezhanghuan_cn_jintest_MainActivity_BIND_ABOVE_CLIENT8L#undefzhanghuan_cn_jintest_MainActivity_BIND_ADJUST_WITH_ACTIVITY
  • #definezhanghuan_cn_jintest_MainActivity_BIND_ADJUST_WITH_ACTIVITY128L#undefzhanghuan_cn_jintest_MainActivity_BIND_ALLOW_OOM_MANAGEMENT
  • #definezhanghuan_cn_jintest_MainActivity_BIND_ALLOW_OOM_MANAGEMENT16L#undefzhanghuan_cn_jintest_MainActivity_BIND_AUTO_CREATE
  • #definezhanghuan_cn_jintest_MainActivity_BIND_AUTO_CREATE1L#undefzhanghuan_cn_jintest_MainActivity_BIND_DEBUG_UNBIND
  • #definezhanghuan_cn_jintest_MainActivity_BIND_DEBUG_UNBIND2L#undefzhanghuan_cn_jintest_MainActivity_BIND_IMPORTANT
  • #definezhanghuan_cn_jintest_MainActivity_BIND_IMPORTANT64L#undefzhanghuan_cn_jintest_MainActivity_BIND_NOT_FOREGROUND
  • #definezhanghuan_cn_jintest_MainActivity_BIND_NOT_FOREGROUND4L#undefzhanghuan_cn_jintest_MainActivity_BIND_WAIVE_PRIORITY
  • #definezhanghuan_cn_jintest_MainActivity_BIND_WAIVE_PRIORITY32L#undefzhanghuan_cn_jintest_MainActivity_CONTEXT_IGNORE_SECURITY
  • #definezhanghuan_cn_jintest_MainActivity_CONTEXT_IGNORE_SECURITY2L#undefzhanghuan_cn_jintest_MainActivity_CONTEXT_INCLUDE_CODE
  • #definezhanghuan_cn_jintest_MainActivity_CONTEXT_INCLUDE_CODE1L#undefzhanghuan_cn_jintest_MainActivity_CONTEXT_RESTRICTED
  • #definezhanghuan_cn_jintest_MainActivity_CONTEXT_RESTRICTED4L#undefzhanghuan_cn_jintest_MainActivity_MODE_APPEND
  • #definezhanghuan_cn_jintest_MainActivity_MODE_APPEND32768L#undefzhanghuan_cn_jintest_MainActivity_MODE_ENABLE_WRITE_AHEAD_LOGGING
  • #definezhanghuan_cn_jintest_MainActivity_MODE_ENABLE_WRITE_AHEAD_LOGGING8L#undefzhanghuan_cn_jintest_MainActivity_MODE_MULTI_PROCESS
  • #definezhanghuan_cn_jintest_MainActivity_MODE_MULTI_PROCESS4L#undefzhanghuan_cn_jintest_MainActivity_MODE_PRIVATE
  • #definezhanghuan_cn_jintest_MainActivity_MODE_PRIVATE0L#undefzhanghuan_cn_jintest_MainActivity_MODE_WORLD_READABLE
  • #definezhanghuan_cn_jintest_MainActivity_MODE_WORLD_READABLE1L#undefzhanghuan_cn_jintest_MainActivity_MODE_WORLD_WRITEABLE
  • #definezhanghuan_cn_jintest_MainActivity_MODE_WORLD_WRITEABLE2L#undefzhanghuan_cn_jintest_MainActivity_DEFAULT_KEYS_DIALER
  • #definezhanghuan_cn_jintest_MainActivity_DEFAULT_KEYS_DIALER1L#undefzhanghuan_cn_jintest_MainActivity_DEFAULT_KEYS_DISABLE
  • #definezhanghuan_cn_jintest_MainActivity_DEFAULT_KEYS_DISABLE0L#undefzhanghuan_cn_jintest_MainActivity_DEFAULT_KEYS_SEARCH_GLOBAL
  • #definezhanghuan_cn_jintest_MainActivity_DEFAULT_KEYS_SEARCH_GLOBAL4L#undefzhanghuan_cn_jintest_MainActivity_DEFAULT_KEYS_SEARCH_LOCAL
  • #definezhanghuan_cn_jintest_MainActivity_DEFAULT_KEYS_SEARCH_LOCAL3L#undefzhanghuan_cn_jintest_MainActivity_DEFAULT_KEYS_SHORTCUT
  • #definezhanghuan_cn_jintest_MainActivity_DEFAULT_KEYS_SHORTCUT2L#undefzhanghuan_cn_jintest_MainActivity_RESULT_CANCELED
  • #definezhanghuan_cn_jintest_MainActivity_RESULT_CANCELED0L#undefzhanghuan_cn_jintest_MainActivity_RESULT_FIRST_USER
  • #definezhanghuan_cn_jintest_MainActivity_RESULT_FIRST_USER1L#undefzhanghuan_cn_jintest_MainActivity_RESULT_OK
  • #definezhanghuan_cn_jintest_MainActivity_RESULT_OK-1L/*
  • *Class:zhanghuan_cn_jintest_MainActivity*Method:getStringFromNative
  • *Signature:()Ljava/lang/String;*/
  • JNIEXPORTjstringJNICALLJava_zhanghuan_cn_jintest_MainActivity_getStringFromNative(JNIEnv*,jobject);
  • #ifdef__cplusplus
  • }#endif
  • #endif

     

    是不是發現和第一種情況產生的.h 檔案不同,多了很多的東西。不過這些東西好像然並卵,如果你知道其中的區別還請留言告訴我,非常感謝。

    當然了,你還可以用第一種情況中的命令,也是OK的,同時不加上-classpath 和 android.jar,只指定要編譯的類檔案和.h檔案目錄就可以,如下:

  • javah-djniD:\MyProject\AndroidStudio\JinTest\app\build\intermediates\classes\debugzhanghuan.cn.jintest.MainActivity

    -d jni 是指定.h 產生後放的位置,不要自己建也是可以的。

    最後產生的.so 檔案在app\build\intermediates\ndk\debug\lib 下,如:

    到此,全部的情況都已介紹完畢,當然了,如果你在做的時候有問題的話歡迎留言,我們大家一起討論交流。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.