저는 JNI를 사용하는 Gradle managed Android 프로젝트를 해킹하려고 시도했지만 약간의 문제가 있습니다. NDK 지원은 여전히 비교적 새롭고 대부분 문서화되지 않았지만, 나는 그것을 Gradle 빌드에 구두 조종하기위한 기본 요소를 찾을 수있었습니다. 분명히 트릭은 src/main/jni
아래 네이티브 코드를 모두 포함합니다 (defaultConfig
블록에 예) 당신의 CONFIGS 중 하나에 다음을 드롭하는 것입니다Gradle 및 Android Studio가있는 안드로이드 라이브러리 프로젝트의 NDK Dev
ndk {
moduleName "mylib"
}
문제는 그 내 프로젝트를 빌드 할 때 ndk 플러그인은 원시 소스에 대한 절대 경로가 포함 된 Android.mk 파일을 생성합니다. 이로 인해 make
은 경로가 상대 경로로 간주되기 때문에 중단됩니다. 내 경우에는 내가 src/main/jni
에서 1 CPP 소스/헤더 콤보 간단한 라이브러리 프로젝트를하고 난이 gradle.build
사용
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := mylib
LOCAL_SRC_FILES := \
/Users/clifton/dev/Multi/MultiAndroid/lib/src/main/jni/Android.mk \
/Users/clifton/dev/Multi/MultiAndroid/lib/src/main/jni/myNativeSectionTextProvider.cpp \
LOCAL_C_INCLUDES += /Users/clifton/dev/Multi/MultiAndroid/lib/src/main/jni
LOCAL_C_INCLUDES += /Users/clifton/dev/Multi/MultiAndroid/lib/src/debug/jni
include $(BUILD_SHARED_LIBRARY)
: 빌드를 실행
apply plugin: 'android-library'
android {
compileSdkVersion 19
buildToolsVersion "19.0.3"
defaultConfig {
minSdkVersion 9
targetSdkVersion 19
versionCode 1
versionName "1.0"
ndk {
moduleName "mylib"
}
}
buildTypes {
release {
runProguard false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
}
}
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile 'com.android.support:appcompat-v7:19.+'
}
빌드/NDK/디버그에서이 Android.mk를 생성 절대 경로가 상대적으로 잘못 변환되므로
make: *** No rule to make target `/Users/clifton/dev/Multi/MultiAndroid/lib/build/ndk/debug//Users/clifton/dev/Multi/MultiAndroid/lib/src/main/jni/myNativeSectionTextProvider.cpp', needed by `/Users/clifton/dev/Multi/MultiAndroid/lib/build/ndk/debug/obj/local/armeabi-v7a/objs/mylib//Users/clifton/dev/Multi/MultiAndroid/lib/src/main/jni/myNativeSectionTextProvider.o'. Stop.
... : 실행이 오류를 생성 할 때,
.... 내가 파일을 수동으로 편집과 같이 상대적으로 경로를 변경하는 경우 :
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := mylib
LOCAL_SRC_FILES := \
../../../src/main/jni/Android.mk \
../../../src/main/jni/myNativeSectionTextProvider.cpp \
LOCAL_C_INCLUDES += ../../../src/main/jni
LOCAL_C_INCLUDES += ../../../src/debug/jni
include $(BUILD_SHARED_LIBRARY)
을 ... 나는이 오류를 얻을 :
/Users/clifton/dev/Multi/MultiAndroid/lib/build/ndk/debug/../../../src/main/jni/com_craig_multiandroid_app_NativeSectionTextProvider.h:2:17: fatal error: jni.h: No such file or directory
내 질문은 내가이 문제를 해결하기 위해 할 수있는 무엇인가? 나는 .aar 빌드에 대한 내 자신의 맞춤형 gradle 지원을 해킹하기 시작했으나 .rad 파일을 생성하는 책임이있는 Gradle 작업을 파악하기 위해 분실했습니다. (Gradle 문서는 풍부하지만 특정 Android Gradle 작업 API에 대한 세부 정보를 찾기가 어렵습니다.) cmd 라인을 통해 ndk 빌드를 실행하고 .so 파일을 생성하는 부분적으로 작동하는 gradle.build가 있는데, .aar 내부의 .so를 인라인하는 법을 이해해야한다. Android Studio 0.5.7 및 Gradle 1.11을 사용하고 있습니다. 몇 달 전에 Gradle 소스를 가져 왔는데, 이는 .apk 프로젝트의 .so 및 gdbserver 파일을 인라인하는 방법을 알아 냈지만 .aar 프로젝트에는 적용되지 않는 규칙입니다. 다른 사람이 시도 했습니까? 어디에서 대답 할 수 있습니까?