2014-04-28 2 views
5

저는 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 프로젝트에는 적용되지 않는 규칙입니다. 다른 사람이 시도 했습니까? 어디에서 대답 할 수 있습니까?

답변

7

마침내 알아 냈습니다! 최신 Gradle NDK 지원을 위해서는 최신 NDK를 사용해야합니다. 내 local.properties (및 내 ~/.bashrc) android-ndk-r8e 안드로이드 ndk-r9d있는 깨진 된 gdb 서버 지원을 해결하려면 가리키는했지만 반면에 android-ndk-r9d 내 gradb 빌드가 작동하기 시작 여분의 해킹없이. 요약하면 위의 예제는 local.properties가 NDK의 버전 9b +를 가리키는 한 작동합니다.

관련 문제