これに関連する回答があることは承知していますが、それらは古くて時代遅れです。 Android Studio 1.3を入手し、既にAndroid NDKをダウンロードしました。アプリを実行すると、クラッシュし、Logcat
にfindLibrary returned null
が表示されます。これは.so
ライブラリファイルがないためであることがわかりました(間違っている場合は修正してください)。私の質問は-Android Studioで.soファイルを生成するにはどうすればよいですか?
私が持っているもの-
注意-ライブラリ.so
ファイルをCygwin
またはCMD
から構築する必要がある場合、その方法を教えてください。
NDKをAndroid Studioに接続するには、いくつかの手順が必要です。現在、サポートはexperimental ASは、IDE内でNDKをダウンロードする機能をバンドルし始めています。デフォルトでは、ASは、ソースまたはライブラリ(あるいはその両方)がjni
に配置されている場合、汎用Android.mk
およびApplication.mk
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年後Android Studio 2.2以降では、新しいプロジェクトを作成するときに[C++サポートを含める]を選択するだけで、これらすべてを無料で完了できます。
詳細については、 https://developer.Android.com/studio/projects/add-native-code.html をご覧ください。