我知道有相关的答案,但它们已经过时了。我有Android Studio 1.3,已经下载了Android NDK。当我运行应用时,它崩溃并在findLibrary returned null
中提供Logcat
。我发现这是因为没有.so
库文件(如果我错了,请纠正我)。我的问题是 - 如何在Android Studio中生成.so文件?
我拥有什么 -
注意 - 如果必须从.so
或Cygwin
构建库CMD
文件,请告诉我该怎么做。
答案 0 :(得分:14)
将NDK连接到Android Studio需要几个步骤。目前,支持标记为 experimental ,AS开始捆绑在IDE中下载NDK的功能。默认情况下,当源和/或库放在Android.mk
或Application.mk
文件夹中时,AS使用通用jni
和jniLibs
。以下说明会覆盖这些默认值,以提供更多自定义功能。
简而言之,您需要:
jni
和jniLibs
目录。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 强>
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 强>
为您的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
编译并运行。
答案 1 :(得分:9)
一年后,使用Android Studio 2.2及更高版本,您现在可以通过选择&#34;包含C ++支持&#34;免费为您完成所有这些操作。在创建新项目时。
有关详细信息,请查看:https://developer.android.com/studio/projects/add-native-code.html。