在Android Studio中生成.so文件

Fad*_*der 21 android android-ndk android-studio

我知道有相关的答案,但它们已经过时了.我有Android Studio 1.3,已经下载了Android NDK.当我运行一个应用程序,它崩溃并给出了findLibrary returned nullLogcat.我发现这是因为没有.so库文件(如果我错了就纠正我).我的问题是 - 如何在Android Studio中生成.so文件?

是)我有的 -

  • Android Studio 1.3稳定版
  • Gradle 1.5
  • Android实验插件0.2

注意 -如果.so必须使用Cygwin或构建库文件CMD,请告诉我如何操作.

nat*_*ore 16

将NDK连接到Android Studio需要几个步骤.目前,支持被标记为实验性的,AS开始捆绑在IDE中下载NDK的能力.默认情况下,AS使用泛型,Android.mk并且Application.mk源和/或库放在jnijniLibs文件夹中.下面的说明覆盖了这些默认值,以提供更多自定义功能.

简而言之,您需要:

  1. 为源和库创建默认jnijniLibs目录.
  2. 告诉Android Studio在哪里可以找到您的NDK构建链
  3. 告诉gradle如何编译以及放置lib的位置
  4. 创建一个Android.mk文件以指定构建和链接顺序
  5. 创建一些来源

创建目录

在里面/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")
}
}
Run Code Online (Sandbox Code Playgroud)

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)
Run Code Online (Sandbox Code Playgroud)

TEST.CPP

为你的lib添加一些很棒的C/C++源代码.这些文件将从您的文件/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
Run Code Online (Sandbox Code Playgroud)

编译并运行.

  • @nathansizemore生成的.so文件在哪里?谢谢 (2认同)

Art*_*hur 10

一年后,使用Android Studio 2.2及更高版本,您现在可以在创建新项目时选择"包含C++支持",免费为您完成所有这些工作.

有关更多信息,请访问:https://developer.android.com/studio/projects/add-native-code.html.

  • 是的,经过很长一段时间,Android Studio终于为NDK添加了完整的工作支持:) (2认同)