के साथ मैं एक ग्रेडल प्रबंधित एंड्रॉइड प्रोजेक्ट पर हैक करने की कोशिश कर रहा हूं जो जेएनआई का उपयोग करता है और मुझे कुछ परेशानी हो रही है। मैं समझता हूं कि एनडीके समर्थन अभी भी अपेक्षाकृत नया और अधिकतर अनियंत्रित है, लेकिन मैंने जूता के निर्माण के लिए मूल तत्वों को एक ग्राडल बिल्ड में ढूंढने में कामयाब रहा है। जाहिरा तौर पर चाल 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 प्रोजेक्ट पर लागू नहीं होते हैं। क्या किसी और ने इसका प्रयास किया है? मैं जवाब के लिए कहां जा सकता हूं?