2017-02-24 4 views
11

के लिए संकलन सी लाइब्रेरी अवधारणा के सबूत के रूप में, मैं एंड्रॉइड ऐप के लिए this लाइब्रेरी की शक्ति संकलित और उपयोग करने की कोशिश कर रहा हूं। मैं एंड्रॉइड स्टूडियो का उपयोग कर रहा हूँ। क्या मैं अब तक क्या किया है किया गया था:एंड्रॉइड

  1. स्थापित NDK और एसडीके (मैं एंड्रॉयड संस्करण 4.0.3 और ऊपर यदि संभव हो तो लक्ष्य बनाना चाहते हैं)
  2. बनाया एंड्रॉयड स्टूडियो में एक Android परियोजना
  3. बनाया गया
  4. में JNI फ़ोल्डर मेरी JNI फ़ोल्डर में पुस्तकालय की सभी सामग्री संग्रहित
  5. Android.MK फ़ाइल कि स्रोतों में मौजूद था करने के लिए अपने build.gradle लिंक्ड

    externalNativeBuild { 
        ndkBuild { 
         path 'src/main/jni/Android.mk' 
        } 
    } 
    
  6. आदेश आर्किटेक्चर के लिए एक निर्माण कि पुस्तकालय द्वारा समर्थित नहीं हैं बनाने की कोशिश कर से बचने के लिए सेट ProductFlavors (मैं गलत यहाँ पहले से ही हो सकता है)

    productFlavors { 
        dev { ndk.abiFilters 'x86', 'armeabi', 'armeabi-v7a' } 
        develx86 { ndk.abiFilters 'x86', 'armeabi', 'armeabi-v7a' } 
        production { ndk.abiFilters 'x86', 'armeabi', 'armeabi-v7a' } 
        productionx86 { ndk.abiFilters 'x86', 'armeabi', 'armeabi-v7a' } 
    } 
    
  7. इस बिंदु पर, मैं कुछ है कि ध्यान दिया है सीपीयू miner.c तरह फ़ाइलें अनुपलब्ध हैं कुछ उन्हें याद आ रही के रूप में प्रकाश डाला भी शामिल है, विशेष रूप से

    #include <curl/curl.h> 
    #include <openssl/sha.h>` 
    

तो मैं इन दो पुस्तकालयों की आधिकारिक वेबसाइट के पास गया और सौ से डाउनलोड rces, दो संबंधित फ़ोल्डर्स बनाया और वहां सभी फाइलें रखती हैं। OpenSSL में एक h.in फ़ाइल थी - एक कॉन्फ़िगर जैसा कि मैं समझता हूं। मैं पाने के लिए एक कॉन्फ़िगर किया गया एक here से

(यह भी एक जगह है जहाँ मैं एक गलती की हो सकता है) कर रहा था
  1. मैं निम्नलिखित सामग्री के साथ करने के लिए JNI फ़ोल्डर जड़ Application.mk जोड़ दिया है APP_ABI:= armeabi armeabi-v7a x86 कुछ आर्किटेक्चर को बाहर करने के लिए जो मैं समर्थन नहीं करता हूं।

इस बिंदु पर, मैं कुछ समस्याएं हैं - उनमें से एक है मैं वास्तव में NDK-निर्माण के साथ मेरे JNI सामान निर्माण नहीं कर सकते कि - sched.h हल नहीं है (भले ही मैं 20 के लिए एपीआई संस्करण में वृद्धि) । इस तरह त्रुटियों में परिणाम:

JNI/cpu-miner.c:473:2: error: use of undeclared identifier 'cpu_set_t' 
    cpu_set_t set; 
jni/cpu-miner.c:474:12: error: use of undeclared identifier 'set' 
    CPU_ZERO(&set); 

तो प्रश्न हैं:

  1. मैं कैसे निर्माण sched.h को हल करने के लिए मजबूर कर सकते हैं? मुझे लगता है कि वहाँ एक वास्तव में, क्योंकि वे पुस्तकालय स्रोत कोड में शामिल नहीं थे -
  2. मेरे दृष्टिकोण को डाउनलोड करने और लापता पुस्तकालयों के सूत्रों को जोड़ने या वहाँ था कुछ अन्य विकल्प के साथ सही था? यदि ऐसा है तो - किसी निर्देश उपलब्ध कराएं कैसे जैसे ही मैं ठीक के रूप में
  3. NDK के साथ ऐसा करना (? या यह कोई फर्क नहीं पड़ता कि मैं क्या उस के लिए उपयोग करें) पुस्तकालय का निर्माण करने के लिए यह सिर्फ जावा इंटरफेस उत्पन्न करने के लिए पर्याप्त होगी मेरी सी फाइलें और उनका उपयोग शुरू करें या विचार करने के लिए अतिरिक्त कदम हैं?

    कृपया अगर आप किसी भी आवश्यकता होती है किसी भी अतिरिक्त जानकारी के लिए पूछने के लिए स्वतंत्र महसूस हो रहा है, अग्रिम धन्यवाद।
    अस्वीकरण: मैं एक .NET देव हूं इसलिए कृपया लागू होने पर एंड्रॉइड/सी चीजों के बारे में अधिक विशिष्ट रहें।
    अस्वीकरण 2: इस कार्यक्रम की अवधारणा के प्रमाण के रूप शैक्षिक उद्देश्यों के लिए किया जा रहा है।

+1

कार्य की तरह दिखता है शामिल हैं। जिस प्रकार की समस्या है वह परिभाषित नहीं है। यदि आप https://android.googlesource.com/platform/development/+/73a5a3b/ndk/platforms/android-20/include/sched.h पर एक नज़र डालें - दिलचस्प मैक्रो गार्ड '_GNU_SOURCE' – j2ko

+0

है जो वास्तव में है यह cpu-miner.c – HardLuck

+1

की शुरुआत में 'परिभाषित _GNU_SOURCE' बस यह कह रहा है कि समस्या किसी भी तरह से एनडीके संदर्भ के भीतर '_GNU_SOURCE' मैक्रो के अर्थ से संबंधित हो सकती है। – j2ko

उत्तर

1

यह cpu_set_t तरह लग रहा है जब तक एंड्रॉयड -21 NDK हेडर में आने से पहले नहीं किया था।

एनडीके आर 14 (अप्रकाशित, लेकिन अगले हफ्ते बाहर होना चाहिए) ने हेडर को पूरी तरह से फिर से कर दिया है ताकि आपके पास स्ट्रक्चर परिभाषाओं और स्थिरांक तक पहुंच होगी (चाहे आपको आवश्यक एपीआई एंड्रॉइड- 21 एक अलग सवाल है)। उनका उपयोग करने के लिए, r14 beta पकड़ें और unified headers के लिए निर्देशों का पालन करें।

+0

21 में एपीआई संस्करण को बढ़ाने से कोड लाल नहीं हुआ है, लेकिन बिल्ड को धूलने में त्रुटि अभी भी वहां है और इसमें स्वयं शामिल है। मैंने जांच की है और यह अब 21 संस्करणों को इंगित करता है – HardLuck

+0

मेरा अनुमान है कि यह केवल कुछ एबीआई के लिए असफल रहा। सीधे 'ndk-build' चलाने के @ AlexCohn के सुझाव का प्रयास करें। यदि यह काम करता है, तो armeabi-v7a और x86 को शामिल करने के लिए 'APP_ABI' का विस्तार करने का प्रयास करें जब तक कि आप विफल होने वाले किसी को न ढूंढें। इनमें से किसी भी विफल आदेश का आउटपुट सहायक होगा। –

0

इस ऐड कोशिश करने से पहले अपने में शामिल <sched.h>

#define _GNU_SOURCE 

मामले में अगर यह काम नहीं करता है, बस आप cpu-miner.c फ़ाइल संरचना नीचे जोड़ें:

#define CPU_SETSIZE 1024 
#define __NCPUBITS (8 * sizeof (unsigned long)) 
typedef struct 
{ 
    unsigned long __bits[CPU_SETSIZE/__NCPUBITS]; 
} cpu_set_t; 
+0

धन्यवाद। इससे मुझे आगे बढ़ने में मदद मिली है, लेकिन अब मेरे पास 'jni/cpu-miner.c: 1487 जैसे त्रुटियों के टन हैं: त्रुटि:' json_object_get'' 'के लिए अपरिभाषित संदर्भ,' jni/compat/jansson/jansson.h: 109 : त्रुटि: 'json_delete'' के लिए अपरिभाषित संदर्भ,' jni/cpu-miner.c: 2900: त्रुटि: 'json_load_file'' के लिए अपरिभाषित संदर्भ और इसी तरह। – HardLuck

+0

क्या आपके पास जेसन लाइब्रेरी शामिल है? LOCAL_LDLIBS जोड़ने का प्रयास करें: = -ljson अपने Android.mk – BhanuSingh

+0

में आपके इनपुट के लिए धन्यवाद। इस पंक्ति को जोड़ने से त्रुटि 'त्रुटि उत्पन्न हुई: -ljson' नहीं मिल सका। अनुलेख इस लाइन के बिना भी मैं कोड से निर्दिष्ट प्रकार पर नेविगेट कर सकता हूं, इसे 'jansson.h' में संग्रहीत किया जाता है, इसलिए मुझे लगता है कि समस्या कहीं और हो सकती है – HardLuck