問題の解決策を探したり、さまざまなフォーラム(これを含む)を閲覧したりして時間を過ごした後、最終的に私は別の場所で完全に回答されていないことを願って質問しました。私はかなり複雑なアーキテクチャ構築しようとしているAndroidスタジオ - App + NDKモジュールライブラリ
:
- 私は私がコンパイルCソースを持っているが、私は、モジュールライブラリでJNI経由でそれらを使用する(.A)
- 静的ライブラリを分離
- 私はこのライブラリをアプリプロジェクトで使いたいです。
私は最初に正常に次のテストを行いました - 私はすでにNDKのないモジュールライブラリを作成し、アプリケーションでコンパイルすることができました。 - は私もアプリ内で直接静的ライブラリとJNIを使用するように管理しますが
私は、次のステップで失敗しています: - モジュールのクラスを呼び出すモジュールとアプリ内のJNIの組み合わせは動作しません。 。
aarがライブラリのbuild/outputsディレクトリにある間に私のアプリケーションのビルドディレクトリでexploded-aarを見つけることができないので、aarのインクルードに問題があると思います。さらに、以前のすべてのテスト( JNIの使用を含む)はすべて成功しました。
私は実験的なモデルで、実験的なもので、静的ライブラリには既知の制限があるため、使用しません。
私のプロジェクトの構造は次のとおりです。
- App
- src
- main
- java
- activity
- bar
- src
- main
- java
- class
- jni
- include
- *.h
- libs
- abis...
- libmod1.a
- libmod2.a
Android.mk
Application.mk
bar.c
bar.h
アプリのbuild.gradleは次のようになります。
apply plugin: 'com.android.application'
android {
compileSdkVersion 23
buildToolsVersion "23.0.0"
defaultConfig {
applicationId "com.test.foo"
minSdkVersion 10
targetSdkVersion 23
versionCode 1
versionName "1.0"
}
buildTypes {
release {
debuggable false
jniDebuggable false
minifyEnabled false
}
unsigned {
debuggable false
jniDebuggable false
minifyEnabled false
}
debug {
debuggable true
jniDebuggable true
minifyEnabled false
}
}
productFlavors {
x86 {
ndk {
abiFilter "x86"
}
}
mips {
ndk {
abiFilter "mips"
}
}
armv7 {
ndk {
abiFilter "armeabi-v7a"
}
}
arm {
ndk {
abiFilter "armeabi"
}
}
fat
}
project.ext.versionCodes = ['armeabi':1, 'armeabi-v7a':2, 'arm64-v8a':3, 'mips':5, 'mips64':6, 'x86':8, 'x86_64':9]
android.applicationVariants.all { variant ->
variant.outputs.each { output ->
output.versionCodeOverride =
project.ext.versionCodes.get(output.getFilter(com.android.build.OutputFile.ABI), 0) * 1000000 + defaultConfig.versionCode
}
}
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar','*.aar'])
compile project(":bar")
}
モジュールbuild.gradleは次のようになります。
apply plugin: 'com.android.library'
android {
compileSdkVersion 23
buildToolsVersion "23.0.0"
defaultConfig {
minSdkVersion 10
targetSdkVersion 23
versionCode 1
versionName "1.0"
ndk {
moduleName "module"
}
}
buildTypes {
release {
debuggable false
jniDebuggable false
minifyEnabled false
}
unsigned {
debuggable false
jniDebuggable false
minifyEnabled false
}
debug {
debuggable true
jniDebuggable true
minifyEnabled false
}
}
productFlavors {
x86 {
ndk {
abiFilter "x86"
}
}
mips {
ndk {
abiFilter "mips"
}
}
armv7 {
ndk {
abiFilter "armeabi-v7a"
}
}
arm {
ndk {
abiFilter "armeabi"
}
}
fat
}
sourceSets.main {
jniLibs.srcDir 'src/main/libs'
jni.srcDirs = []
}
task ndkBuild(type: Exec) {
commandLine android.ndkDirectory.getAbsolutePath()+'/ndk-build', '-C', file('src/main').absolutePath
}
tasks.withType(JavaCompile) {
compileTask -> compileTask.dependsOn ndkBuild
}
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
}
私のAndroid.mkは、モジュールjniディレクトリ内にあります: LOCAL_PATH:= $(my-dirを呼び出します)
#### Mod1
include $(CLEAR_VARS)
LOCAL_MODULE := mod1
LOCAL_SRC_FILES := libs/$(TARGET_ARCH_ABI)/libmod1.a
include $(PREBUILT_STATIC_LIBRARY)
#### Mod2
include $(CLEAR_VARS)
LOCAL_MODULE := pxnav
LOCAL_SRC_FILES := libs/$(TARGET_ARCH_ABI)/libmod2.a
LOCAL_STATIC_LIBRARIES := pxfd
include $(PREBUILT_STATIC_LIBRARY)
##### Parser
include $(CLEAR_VARS)
LOCAL_MODULE := module
LOCAL_C_INCLUDES := $(LOCAL_PATH)/include
LOCAL_LDLIBS += -landroid -llog
LOCAL_SRC_FILES := bar.c
LOCAL_STATIC_LIBRARIES := mod1 mod2
include $(BUILD_SHARED_LIBRARY)
私は、生成されたaarを直接使用すると、それを追加します。新しいモジュール> .jar/.aarをインポートすると、それも完全に動作します。私はコンパイルするたびに指定されたディレクトリにaarをコピーする必要はありません。 –