2015-01-08 5 views
16

साथ अपने ही Android.mk फ़ाइल का उपयोग कैसे करें मैं Android.mk फ़ाइल (मैं संकलक के लिए कुछ झंडे गुजर रहा) के भीतर कुछ चर को परिभाषित कर रहा हूँ, लेकिन हर बार मैं अपने प्रोजेक्ट का निर्माण, Android.mk ओवरराइट है। मुझे लगता है कि Gradle ज़िम्मेदार है और मुझे वहां देखना चाहिए? मैं अपनी खुद की एंड्रॉइड.एमके फ़ाइल का उपयोग कैसे करूं?एंड्रॉयड Sudio

पृष्ठभूमि जानकारी:

Ubuntu 64 बिट, Android Studio 1.0.1, JDK7। मैं O-LLVM NDK के साथ मेरी NDK संस्करण लिपटे है, और इस तरह के संपादन कर रहा हूँ के रूप में Android.mkapp/build/intermediates/ndk/debug पर स्थित फ़ाइल, स्थान कि O-LLVM के लिए दस्तावेज़ के उदाहरण देता है के लिए अलग अलग है (यह अपने प्रोजेक्ट निर्देशिका के भीतर केवल Android.mk फ़ाइल है)।

इसके अलावा, Application.mk फ़ाइल नहीं है, तो फिर मुझे लगता है कि Gradle संकलक को कॉल के लिए ज़िम्मेदार है?

किसी भी मदद की सराहना की जाएगी।

केली


Updated जानकारी

build.gradle - (एप्लिकेशन)

//The following code until the "----" line is the new build.gradle config file 
// that disables automatic Android.mk file generation 

import org.apache.tools.ant.taskdefs.condition.Os 
apply plugin: 'com.android.application' 

android { 

    compileSdkVersion 21 
    buildToolsVersion "21.1.2" 

    defaultConfig { 
     applicationId "com.md.helloworld" 
     minSdkVersion 15 
     targetSdkVersion 21 
     versionCode 1 
     versionName "1.0" 
     ndk { 
      moduleName "MyLib" 
     } 
    } 

    buildTypes { 
     release { 
      minifyEnabled false 
      proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 
     } 
    } 

    sourceSets.main { 
     jniLibs.srcDir 'src/main/libs' //set libs as .so's location instead of jni 
     jni.srcDirs = [] //disable automatic ndk-build call with auto-generated Android.mk file 
    } 

    // Call regular ndk-build (.cmd) script from the app directory 
    task ndkBuild(type: Exec) { 
     commandLine 'ndk-build', '-C', file('src/main/').absolutePath 
    } 

    tasks.withType(JavaCompile) { 
     compileTask -> compileTask.dependsOn ndkBuild 
    } 
} 

dependencies { 
    compile fileTree(dir: 'libs', include: ['*.jar']) 
    compile 'com.android.support:appcompat-v7:21.0.3' 
} 

/* 
//The following code is the original Android.mk file 

apply plugin: 'com.android.application' 

android { 
    compileSdkVersion 21 
    buildToolsVersion "21.1.2" 

    defaultConfig { 
     applicationId "com.md.helloworld" 
     minSdkVersion 15 
     targetSdkVersion 21 
     versionCode 1 
     versionName "1.0" 
     //The only modified line 
     ndk { 
      moduleName "MyLib" 
     } 
    } 
    buildTypes { 
     release { 
      minifyEnabled false 
      proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 
     } 
    } 
} 

dependencies { 
    compile fileTree(dir: 'libs', include: ['*.jar']) 
    compile 'com.android.support:appcompat-v7:21.0.3' 
} 
*/ 

Android.mk

LOCAL_PATH := $(call my-dir) 

include $(CLEAR_VARS) 

LOCAL_MODULE := helloWorld 
LOCAL_SRC_FILES := main.c 

LOCAL_LDLIBS := -static 

include $(BUILD_EXECUTABLE) 

Application.mk

LOCAL_PATH := $(call my-dir) 

include $(CLEAR_VARS) 

APP_ABI := armeabi 

NDK_TOOLCHAIN_VERSION := clang3.4-obfuscator 

include $(BUILD_EXECUTABLE) 

कृपया ध्यान दें: मैं किसी भी CFLAGS गुजर नहीं कर रहा हूँ, लेकिन अब तक, मैं एक वेनिला काम कर निर्माण पहले

उत्तर

22

हाँ पाने के लिए कोशिश कर रहा हूँ, डिफ़ॉल्ट रूप से gradle android प्लगइन आपके स्रोतों को संकलित करने के लिए अपने Android.mk फ़ाइल को पुन: उत्पन्न करता है और उसका उपयोग करता है।

आप इस निष्क्रिय और अपने खुद के Android.mk फ़ाइल का उपयोग करने के बजाय, अपने build.gradle विन्यास फाइल के अंदर इस सेटिंग के द्वारा कर सकते हैं:

import org.apache.tools.ant.taskdefs.condition.Os 
...  
android { 
    ... 

    sourceSets.main { 
     jniLibs.srcDir 'src/main/libs' //set libs as .so's location instead of jniLibs 
     jni.srcDirs = [] //disable automatic ndk-build call with auto-generated Android.mk 
    } 

    // call regular ndk-build(.cmd) script from app directory 
    task ndkBuild(type: Exec) { 
     if (Os.isFamily(Os.FAMILY_WINDOWS)) { 
      commandLine 'ndk-build.cmd', '-C', file('src/main').absolutePath 
     } else { 
      commandLine 'ndk-build', '-C', file('src/main').absolutePath 
     } 
    } 

    tasks.withType(JavaCompile) { 
     compileTask -> compileTask.dependsOn ndkBuild 
    } 
} 

नोट है कि आप केवल अपने स्वयं के पारित करने के लिए की जरूरत है ऑटो-जनरेटेड मेकफ़ाइल के लिए cflags, आप

+0

धन्यवाद ph0b के अंदर सेट करने के लिए cFlags "" प्रॉपर्टी के अंदर सेट कर सकते हैं। अब मेरे पास समस्या यह है कि build.gradle कॉन्फ़िगरेशन फ़ाइल के भीतर ndk-build को कॉल संकलित नहीं करता है, इसलिए मैंने उस पंक्ति को हटा दिया और जावा कंपाइलर की निर्भरता को हटा दिया, और कमांड लाइन से ndk-build चलाया। यह एनएनडीके जुर्माना बनाता है, हालांकि अब मेरे पास .so फाइलें उत्पन्न नहीं हुई हैं। कोई संकेतक या टिप्स? – KyleM

+1

मुझे नहीं लगता कि यह क्यों संकलित नहीं होगा, शायद आप 'import org.apache.tools.ant.taskdefs.condition.Os' को भूल गए हैं? एसएसओ एनडीके-बिल्ड द्वारा उत्पन्न होते हैं, डिफ़ॉल्ट रूप से libs/(armeabi | armeabi-v7a | x86 | mips | ...) के अंदर। जांचें कि 'src/main/libs' पथ सही है और आपकी .so फाइलें हैं। – ph0b

+1

हाय ph0b, मैंने संकलन त्रुटि को ठीक किया है, ndk-build कमांड के रूप में उपलब्ध नहीं था, इसलिए इसे हल किया गया है। अब मेरे पास यह मुद्दा यह है कि .so फाइलें कहीं भी उत्पन्न नहीं हो रही हैं। मैंने उन्हें पूरी परियोजना निर्देशिका में खोजा है, लेकिन नई ग्रेड फ़ाइल के साथ प्रोजेक्ट बनाने के बाद से कोई भाग्य नहीं है। प्रोजेक्ट ठीक बनाता है, लेकिन दौड़ने की कोशिश करते समय, एक असंतुष्ट लिंक्स त्रुटि है क्योंकि इसे libMyLib.so फ़ाइल नहीं मिल सकती है। मैंने अपने प्रश्न को मेरी gradle.build फ़ाइल और Android.mk फ़ाइल और Application.mk फ़ाइल दोनों के साथ अपडेट किया है। बहुत धन्यवाद ph0b – KyleM