android - 在 Android Studio 中生成 .so 文件

标签 android android-studio android-ndk

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

我有什么 -

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

注意 - 如果库 .so 文件必须从 CygwinCMD 构建,请告知我该怎么做。

最佳答案

将 NDK 连接到 Android Studio 需要几个步骤。目前,支持标记为实验性,并且 AS 开始 bundle 在 IDE 中下载 NDK 的功能。默认情况下,当源和/或库放在 jni 中时,AS 使用通用 Android.mkApplication.mk jniLibs 文件夹。下面的说明会覆盖这些默认值,以提供更多的自定义功能。

简而言之,您需要:

  1. 为您的源代码和库创建默认的 jnijniLibs 目录。
  2. 告诉 Android Studio 在哪里可以找到您的 NDK 构建链
  3. 告诉 gradle 如何编译以及将库放在哪里
  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")
}
}

Android.mk

您将需要 /app/src/main/jni 目录中的 Android.mk 文件

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++ 源代码。这些文件将从 /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

编译并运行。

关于android - 在 Android Studio 中生成 .so 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32443496/

相关文章:

ios - print() 语句未在 Android Studio 中的 flutter iOS 应用程序中打印到控制台

具有自定义工作目录的 Android Studio 终端

android - Okhttp 3 (安卓) : connecting to ip address with self signed ssl

android - cordova 2.7 与 phonegap-facebook-plugin - 在 ConnectPLugin.java 中构建错误

Android Instrumentation 测试在 Travis CI AVD 上失败但在本地模拟器上工作

java - 无法使用自定义 View 在 Canvas 上绘图

android - Windows 上的文件路径太长

c++ - re write-sql statement Insert OR REPLACE 从java到c++ NDK Android

android - 通过 beaglebone black 中的 GPIO 映射内存

android - UnsatisfiedLinkError : . ..:findLibrary 返回空