2015-09-07 74 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

相关问题