在 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
文件必须从 Cygwin
或 CMD
构建,请告诉我该怎么做。
【问题讨论】:
你能使用 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 的能力。默认情况下,当源和/或库放在jni
或jniLibs
文件夹中时,AS 使用通用的Android.mk
和Application.mk
。下面的说明会覆盖这些默认值,以提供更多的自定义功能。
简而言之,您需要:
-
为您的源代码和库创建默认的
jni
和 jniLibs
目录。
告诉 Android Studio 在哪里可以找到您的 NDK 构建链
告诉 gradle 如何编译以及将库放在哪里
创建一个Android.mk
文件以指定构建和链接顺序
创建一些源
创建目录
在/app/src/main
内部创建jni
和jniLibs
目录。
更新 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 无法在 proguard 错误配置中生成签名的 APK
在 Android Studio 4.1.3 中生成 APK 时插件“JetBrains Marketplace”出现不兼容错误