2015-09-07 5 views
17

में .so फ़ाइल जेनरेट करें मुझे पता है कि इससे संबंधित उत्तर हैं, लेकिन वे पुराने और पुराने हैं। मुझे एंड्रॉइड स्टूडियो 1.3 मिला है और पहले ही एंड्रॉइड एनडीके डाउनलोड किया गया है। जब मैं ऐप चलाता हूं, तो यह क्रैश हो जाता है और findLibrary returned nullLogcat में देता है। मुझे पता चला कि यह .so लाइब्रेरी फ़ाइल के कारण था (अगर मैं गलत हूं तो मुझे सही करें)। मेरा सवाल है - मैं एंड्रॉइड स्टूडियो में .so फ़ाइल कैसे उत्पन्न करूं?एंड्रॉइड स्टूडियो

मैं क्या है -

  • एंड्रॉयड स्टूडियो 1.3 स्थिर संस्करण
  • Gradle 1.5
  • एंड्रॉयड प्रायोगिक प्लगइन 0,2

सूचना - तो पुस्तकालय .so फ़ाइल है Cygwin यासे बनाया जाना है, कृपया मुझे बताएं कि यह कैसे करें।

+0

क्या आप स्टूडियो 2.1 का उपयोग कर फ़ाइल बना सकते हैं? – Hunt

उत्तर

12

एंड्रॉइड स्टूडियो में एनडीके को जोड़ने के लिए कुछ कदम उठाए गए हैं। वर्तमान में, समर्थन प्रयोगात्मक के रूप में चिह्नित किया गया है और एएस आईडीई के भीतर एनडीके डाउनलोड करने की क्षमता को बंडल करना शुरू कर रहा है। डिफ़ॉल्ट रूप से, AS एक सामान्य Android.mk और Application.mk का उपयोग करता है जब स्रोत और/या libs jni या jniLibs फ़ोल्डर में रखे जाते हैं। अधिक अनुकूलन क्षमता प्रदान करने के लिए नीचे दिए गए निर्देश उन डिफ़ॉल्ट को ओवरराइड करते हैं।

संक्षेप में, आप की आवश्यकता होगी करने के लिए:

  1. डिफ़ॉल्ट बनाएं अपने स्रोत और libs के लिए jni और jniLibs निर्देशिका।
  2. बताएँ एंड्रॉयड स्टूडियो जहाँ आपके NDK निर्माण श्रृंखला को खोजने के लिए
  3. Gradle कैसे संकलित करने के लिए बताएँ और जहाँ आपके libs जगह
  4. निर्माण और जोड़ने के क्रम
  5. निर्दिष्ट करने के लिए कुछ स्रोत
बनाएँ Android.mk फ़ाइल बनाएँ

बनाएं निर्देशिका

/app/src/main के अंदर jni और jniLibs निर्देशिका बनाएं।

अद्यतन local.properties

अपने local.properties फ़ाइल के अंदर, एक लाइन के लिए इसी तरह जोड़ें:

ndk.dir=/home/nathan/development/bin/android-ndk-r10e

अद्यतन build.gradle

इस मॉड्यूल के स्तर को दर्शाता है आवेदन स्तर नहीं। यह सुनिश्चित करता है कि हमने ऊपर दिए गए चरण में बिल्ड पथ को परिभाषित किया है और Android स्टूडियो को स्वचालित रूप से ndk-build का आह्वान करने की क्षमता को हटा दिया है। एक गाइड के रूप में निम्नलिखित उदाहरण का प्रयोग करें।

apply plugin: 'com.android.model.application' 

model { 
android { 
    compileSdkVersion = 23 
    buildToolsVersion = "23.0.0" 

    defaultConfig.with { 
     applicationId = "com.example.hellojni" 
     minSdkVersion.apiLevel = 4 
     targetSdkVersion.apiLevel = 23 
    } 
} 

compileOptions.with { 
    sourceCompatibility=JavaVersion.VERSION_1_7 
    targetCompatibility=JavaVersion.VERSION_1_7 
} 

/* 
* native build settings 
*/ 
android.ndk { 
    moduleName = "hello-jni" 
    /* 
    * Other ndk flags configurable here are 
    * cppFlags += "-fno-rtti" 
    * cppFlags += "-fno-exceptions" 
    * ldLibs = ["android", "log"] 
    * stl  = "system" 
    */ 
} 
android.buildTypes { 
    release { 
     minifyEnabled = false 
     proguardFiles += file('proguard-rules.txt') 
    } 
} 
android.productFlavors { 
    // for detailed abiFilter descriptions, refer to "Supported ABIs" @ 
    // https://developer.android.com/ndk/guides/abis.html#sa 
    create("arm") { 
     ndk.abiFilters += "armeabi" 
    } 
    create("arm7") { 
     ndk.abiFilters += "armeabi-v7a" 
    } 
    create("arm8") { 
     ndk.abiFilters += "arm64-v8a" 
    } 
    create("x86") { 
     ndk.abiFilters += "x86" 
    } 
    create("x86-64") { 
     ndk.abiFilters += "x86_64" 
    } 
    create("mips") { 
     ndk.abiFilters += "mips" 
    } 
    create("mips-64") { 
     ndk.abiFilters += "mips64" 
    } 
    // To include all cpu architectures, leaves abiFilters empty 
    create("all") 
} 
} 

Android.mk

आप /app/src/main/jni निर्देशिका के अंदर एक Android.mk फ़ाइल की आवश्यकता होगी

LOCAL_PATH := $(call my-dir) 

# Builds a dylib out of test.cpp 
include $(CLEAR_VARS) 
LOCAL_MODULE := test 
LOCAL_SRC_FILES := test.cpp 
LOCAL_LDLIBS := -llog 
include $(BUILD_SHARED_LIBRARY) 

test.cpp

कुछ कमाल सी जोड़ें/सी ++ स्रोत कोड आपके lib के लिए। इन फ़ाइलों को /app/src/main/jni में शुरू होगा और अपने Android.mk

उदाहरण के रूप में विनिर्दिष्ट फ़ाइल

#include <jni.h> 
#include <android/log.h> 

static const char *SOME_TAG = "MyAwesomeTag"; 

extern "C" 
{ 

void 
Java_com_something_something_1android_ClassName_some_fn(JNIEnv *env, jobject obj) 
{ 
    __android_log_print(ANDROID_LOG_VERBOSE, SOME_TAG, "Hello from NDK :)"); 
} 

} // End extern 

संकलित करें और रन संकलित और लिंक किया जाएगा।

+1

आपके द्वारा दिया गया 'ग्रैडल' कोड पुराने एंड्रॉइड प्लगइन के लिए है। नई 'प्रायोगिक प्लगइन' में एक अलग 'ग्रैडल' लेआउट है। क्या आप अपना 'ग्रैडल' कोड अपडेट कर सकते हैं? हालांकि उत्तर के लिए धन्यवाद। – FadedCoder

+0

कोई बात नहीं, इसे नए 'ग्रैडल' कोड के साथ संपादित करें। – FadedCoder

+0

@AnnknownHacker यह एक पुराने बनाम नए संपादन की जरूरी नहीं है। यह आपकी सामग्री के लिए धीरे-धीरे या मेकफ़ाइल का उपयोग करना चाहते हैं। इसके अलावा, एपीआई 4 उन तीन ट्रिपल के लिए नहीं बनाएगा, न ही जावा v1.7 के साथ। – nathansizemore

6

एक साल बाद एंड्रॉइड स्टूडियो 2.2 और उसके बाद के संस्करण के साथ, अब आप एक नई परियोजना बनाते समय "सी ++ समर्थन शामिल करें" चुनकर इसे मुफ्त में प्राप्त कर सकते हैं।

अधिक जानकारी के लिए जांचें: https://developer.android.com/studio/projects/add-native-code.html

+0

हाँ, लंबे समय के बाद, loooong समय, एंड्रॉइड स्टूडियो अंत में एनडीके के लिए पूर्ण कामकाजी समर्थन जोड़ा :) – FadedCoder

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