2014-04-28 33 views
5

Tôi đã cố gắng hack vào một dự án Android được quản lý Gradle sử dụng JNI và tôi đang gặp một chút rắc rối. Tôi hiểu hỗ trợ NDK vẫn còn tương đối mới và hầu hết là không có giấy tờ, nhưng tôi đã xoay xở để tìm ra những yếu tố cơ bản để đánh giày nó thành một Gradle build. Rõ ràng Bí quyết là để bao gồm tất cả các mã mẹ đẻ của bạn dưới src/main/jni và thả các điều sau đây trong một trong configs của bạn (ví dụ như trong khối defaultConfig):NDK Dev trong một dự án thư viện Android với Gradle & Android Studio

ndk { 
    moduleName "mylib" 
} 

Vấn đề là khi tôi cố gắng để xây dựng dự án của tôi, ndk plugin tạo tệp Android.mk bao gồm đường dẫn tuyệt đối tới nguồn gốc. Điều này làm cho make bị nghẹt thở vì nó VẪN xem xét các đường dẫn tương đối. Trong trường hợp của tôi, tôi có một dự án thư viện đơn giản với 1 cpp nguồn/tiêu đề kết hợp dưới src/main/jni và tôi sử dụng này gradle.build:

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.+' 
} 

Chạy xây dựng tạo ra Android.mk này dưới build/ndk/debug:

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) 

... mà khi chạy tạo ra lỗi này:

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. 

... bởi vì các đường dẫn tuyệt đối được chuyển nhầm đến tương đối. Nếu tôi tự chỉnh sửa các tập tin và thay đổi các đường dẫn đến tương đối như sau:

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) 

... sau đó tôi nhận được lỗi này:

/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 

Câu hỏi của tôi là những gì tôi có thể làm gì để khắc phục điều này? Tôi bắt đầu để hack hỗ trợ gradle tùy chỉnh của riêng tôi cho xây dựng .aar nhưng đã bị mất cố gắng để tìm ra nhiệm vụ Gradle có trách nhiệm tạo ra các tập tin .aar. (Các tài liệu Gradle, trong khi phong phú, làm cho nó khó khăn để tìm các chi tiết trên một API nhiệm vụ Gradle Android cụ thể.) Tôi có một gradle.build làm việc một phần sẽ chạy ndk-xây dựng thông qua dòng cmd, tạo ra .so nhưng tôi có thể ' t tìm ra cách để (hoặc thậm chí nếu tôi nên) nội tuyến .so bên trong .aar. Tôi đang sử dụng Android Studio 0.5.7 và Gradle 1.11. Tôi đã kéo nguồn Gradle cách đây vài tháng, đó là cách tôi đã tìm ra cách để nội tuyến các tệp .so và gdbserver trong một dự án .apk thông thường nhưng những quy tắc đó dường như không áp dụng cho các dự án .aar. Có ai khác đã cố gắng này? Tôi có thể đi đâu để trả lời?

Trả lời

7

Tôi đã tìm ra nó cuối cùng! Bạn phải sử dụng NDK mới nhất cho hỗ trợ Gradle NDK mới hơn. Local.properties của tôi (và my ~/.bashrc) đã trỏ đến android-ndk-r8e để làm việc xung quanh hỗ trợ gdb-server bị hỏng trong android-ndk-r9d tuy nhiên khi tôi cập nhật lên android-ndk-r9d thì công việc gradle của tôi bắt đầu hoạt động mà không có thêm hacks. Vì vậy, tóm lại, ví dụ trên DOES làm việc miễn là các điểm local.properties của bạn trỏ tới phiên bản 9b + của NDK.

Các vấn đề liên quan