2014-04-28 6 views
5

के साथ मैं एक ग्रेडल प्रबंधित एंड्रॉइड प्रोजेक्ट पर हैक करने की कोशिश कर रहा हूं जो जेएनआई का उपयोग करता है और मुझे कुछ परेशानी हो रही है। मैं समझता हूं कि एनडीके समर्थन अभी भी अपेक्षाकृत नया और अधिकतर अनियंत्रित है, लेकिन मैंने जूता के निर्माण के लिए मूल तत्वों को एक ग्राडल बिल्ड में ढूंढने में कामयाब रहा है। जाहिरा तौर पर चाल src/main/jni के तहत अपने मूल कोड के सभी शामिल हैं और (defaultConfig ब्लॉक में जैसे) अपने कॉन्फ़िगरेशन में से एक में निम्नलिखित ड्रॉप करने के लिए है:एनडीके देव एक एंड्रॉइड लाइब्रेरी प्रोजेक्ट में ग्रैडल एंड एंड्रॉइड स्टूडियो

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 बिल्ड के लिए अपना खुद का कस्टम ग्रेडल समर्थन हैक करना शुरू कर दिया लेकिन यह पता लगाने की कोशिश कर रहा था कि कौन सा ग्रैडल कार्य .aar फ़ाइल उत्पन्न करने के लिए ज़िम्मेदार है। (ग्रैडल डॉक्स, जबकि भरपूर मात्रा में, एक विशिष्ट एंड्रॉइड ग्रैडल एक्शन एपीआई पर ब्योरा ढूंढना मुश्किल हो जाता है।) मेरे पास आंशिक रूप से काम करने वाला ग्रेड है। बिल्ड जो सीएमडी लाइन के माध्यम से एनडीके-बिल्ड चलाएगा, एसएसओ उत्पन्न करेगा लेकिन मैं ' .aar के अंदर .so को इनलाइन करने के लिए कैसे (या यहां तक ​​कि अगर मुझे चाहिए) को समझें। मैं एंड्रॉइड स्टूडियो 0.5.7 और ग्रैडल 1.11 का उपयोग कर रहा हूं। मैंने कुछ महीने पहले ग्रैडल स्रोत खींच लिया है, इस तरह मैंने यह पता लगाया कि कैसे .sok परियोजना में .so और gdbserver फ़ाइलों को इनलाइन करना है, लेकिन वे नियम .aar प्रोजेक्ट पर लागू नहीं होते हैं। क्या किसी और ने इसका प्रयास किया है? मैं जवाब के लिए कहां जा सकता हूं?

उत्तर

7

मैंने इसे अंत में समझ लिया! आपको नए ग्रैडल एनडीके समर्थन के लिए नवीनतम एनडीके का उपयोग करना होगा। My local.properties (और मेरा ~/.bashrc) एंड्रॉइड-एनडीके-आर 8 डी को एंड्रॉइड-एनडीके-आर 9 डी में टूटा हुआ जीडीबी-सर्वर समर्थन के आसपास काम करने के लिए इंगित कर रहा था, हालांकि जब मैंने एंड्रॉइड-एनएनडी-आर 9 डी में अपडेट किया तो मेरा ग्रेडल बिल्ड काम करना शुरू कर दिया अतिरिक्त हैक्स के बिना। तो संक्षेप में, उपरोक्त उदाहरण तब तक काम करता है जब तक आपकी स्थानीय। प्रॉपर्टीज एनडीके के संस्करण 9 बी + को इंगित करती हैं।

संबंधित मुद्दे