在 Android Studio 中生成 .so 文件

Posted

技术标签:

【中文标题】在 Android Studio 中生成 .so 文件【英文标题】:Generate .so file in Android Studio 【发布时间】:2015-12-03 07:03:57 【问题描述】:

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

我有什么 -

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

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

【问题讨论】:

你能使用 studio 2.1 生成 .so 文件吗? 【参考方案1】:

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

欲了解更多信息,请查看:https://developer.android.com/studio/projects/add-native-code.html

【讨论】:

是的,经过很长时间,Android Studio 终于添加了对 NDK 的完整工作支持 :) @FadedCoder 旧项目呢?我仍然可以从某处选择“包含 C++ 支持”的选项吗?谢谢【参考方案2】:

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

简而言之,您需要:

    为您的源代码和库创建默认的 jnijniLibs 目录。 告诉 Android Studio 在哪里可以找到您的 NDK 构建链 告诉 gradle 如何编译以及将库放在哪里 创建一个Android.mk 文件以指定构建和链接顺序 创建一些源

创建目录

/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

编译并运行。

【讨论】:

您提供的Gradle 代码用于旧的Android 插件。新的Experimental plugin 具有不同的Gradle 布局。你能更新你的Gradle 代码吗?不过感谢您的回答。 @AUnknownHacker 这不一定是新旧编辑。您或多或少想为您的东西使用 gradle 或 makefile。此外,API 4 不会为其中一些三元组构建,Java v1.7 也不会。 @nathansizemore 我收到此错误:***.com/questions/34953368/… @IgorGanapolsky 呃,阅读问题的答案了吗?它会带你一步一步来。 @nathansizemore .so 文件在哪里生成?谢谢

以上是关于在 Android Studio 中生成 .so 文件的主要内容,如果未能解决你的问题,请参考以下文章

无法在 Android Studio 中生成签名的 apk,出现错误

无法在 android studio 中生成签名的 apk

Android Studio 无法在 proguard 错误配置中生成签名的 APK

在 Android Studio 4.1.3 中生成 APK 时插件“JetBrains Marketplace”出现不兼容错误

无法在 Android Studio 中生成签名的 APK,因为缺少 proguard-rules.txt

无法在 android studio 中生成使用 react native 制作的 apk 项目