2015-09-07 70 views
17

我知道有與此相關的答案,但它們已過時並且已過時。我得到了Android Studio 1.3並已經下載了Android NDK。當我運行一個應用程序時,它崩潰並在Logcat中給出findLibrary returned null。我想通了這是由於沒有.so庫文件(糾正我,如果我錯了)。我的問題是 - 如何在Android Studio中生成.so文件?在Android Studio中生成.so文件

我有什麼 -

  • 過Android Studio 1.3穩定版本
  • 搖籃1.5
  • 的Android實驗插件0.2

公告 -如果庫.so文件有從Cygwin或0123建成,請告訴我該怎麼做。

+0

是否可以使用studio 2.1生成.so文件? – Hunt

回答

12

將NDK連接到Android Studio需要幾個步驟。目前,支持被標記爲實驗,並且AS正在開始捆綁在IDE中下載NDK的能力。默認情況下,當源和/或庫放置在jnijniLibs文件夾中時,AS使用通用Android.mkApplication.mk。以下說明覆蓋這些默認設置以提供更多定製功能。

總之,你將需要:

  1. 創建默認jnijniLibs目錄爲源和庫。
  2. 告訴Android的工作室在哪裏可以找到你的NDK構建鏈
  3. 告訴gradle這個如何編譯和在何處放置庫
  4. 創建Android.mk文件中指定建築和鏈接順序
  5. 創建一些源

創建目錄

Inside /app/src/main創建一個jnijniLibs目錄。

更新local.properties

裏面你local.properties文件,添加相似的一行:

ndk.dir=/home/nathan/development/bin/android-ndk-r10e

更新的build.gradle

這指的是模塊級,而不是應用程序級別。這確保我們已經在上面的步驟中定義了構建路徑,並消除了Android Studio自動調用ndk-build的能力。使用以下示例作爲指導。

apply plugin: 'com.android.model.application' 

model { 
android { 
    compileSdkVersion = 23 
    buildToolsVersion = "23.0.0" 

    defaultConfig.with { 
     applicationId = "com.example.hellojni" 
     minSdkVersion.apiLevel = 4 
     targetSdkVersion.apiLevel = 23 
    } 
} 

compileOptions.with { 
    sourceCompatibility=JavaVersion.VERSION_1_7 
    targetCompatibility=JavaVersion.VERSION_1_7 
} 

/* 
* native build settings 
*/ 
android.ndk { 
    moduleName = "hello-jni" 
    /* 
    * Other ndk flags configurable here are 
    * cppFlags += "-fno-rtti" 
    * cppFlags += "-fno-exceptions" 
    * ldLibs = ["android", "log"] 
    * stl  = "system" 
    */ 
} 
android.buildTypes { 
    release { 
     minifyEnabled = false 
     proguardFiles += file('proguard-rules.txt') 
    } 
} 
android.productFlavors { 
    // for detailed abiFilter descriptions, refer to "Supported ABIs" @ 
    // https://developer.android.com/ndk/guides/abis.html#sa 
    create("arm") { 
     ndk.abiFilters += "armeabi" 
    } 
    create("arm7") { 
     ndk.abiFilters += "armeabi-v7a" 
    } 
    create("arm8") { 
     ndk.abiFilters += "arm64-v8a" 
    } 
    create("x86") { 
     ndk.abiFilters += "x86" 
    } 
    create("x86-64") { 
     ndk.abiFilters += "x86_64" 
    } 
    create("mips") { 
     ndk.abiFilters += "mips" 
    } 
    create("mips-64") { 
     ndk.abiFilters += "mips64" 
    } 
    // To include all cpu architectures, leaves abiFilters empty 
    create("all") 
} 
} 

Android.mk

您將需要一個Android.mk文件/app/src/main/jni目錄內

LOCAL_PATH := $(call my-dir) 

# Builds a dylib out of test.cpp 
include $(CLEAR_VARS) 
LOCAL_MODULE := test 
LOCAL_SRC_FILES := test.cpp 
LOCAL_LDLIBS := -llog 
include $(BUILD_SHARED_LIBRARY) 

TEST.CPP

添加一些真棒C/C++源代碼爲你的lib。這些文件將在/app/src/main/jni開始,在你的Android.mk

示例文件中指定

#include <jni.h> 
#include <android/log.h> 

static const char *SOME_TAG = "MyAwesomeTag"; 

extern "C" 
{ 

void 
Java_com_something_something_1android_ClassName_some_fn(JNIEnv *env, jobject obj) 
{ 
    __android_log_print(ANDROID_LOG_VERBOSE, SOME_TAG, "Hello from NDK :)"); 
} 

} // End extern 

編譯和運行將被編譯和鏈接。

+1

您提供的'Gradle'代碼是針對舊版Android插件的。新的'Experimental plugin'具有不同的'Gradle'佈局。你能否更新你的'Gradle'代碼?但感謝您的答案。 – FadedCoder

+0

沒關係,用新的Gradle代碼編輯它。 – FadedCoder

+0

@AUnknownHacker這不一定是舊的和新的編輯。這或多或少是你想爲你的東西使用gradle或makefile。另外,API 4不會爲這些三元組構建,也不會構建Java v1.7。 – nathansizemore

相關問題