2016-03-16 11 views
10

में सुपरपावर्ड lib का उपयोग कैसे करें मैं स्विफ्ट में एक ऐप बनाना चाहता हूं जो केवल आईफोन के माइक के माध्यम से रिकॉर्ड करें और फिर रिकॉर्ड की गई ध्वनि चलाएं।स्विफ्ट प्रोजेक्ट

इसके लिए, मैं lib superpowered का उपयोग करना चाहता हूं जो हेडर फ़ाइलों के साथ एक स्थिर लाइब्रेरी है।

इसके लिए, मैंने अपनी परियोजना में .a और हेडर फ़ाइलों को खींचने और छोड़ने की कोशिश की (एक्सकोड मेरे लिए एक ब्रिजिंग हेडर फ़ाइल बनाएं), एक्सकोड में "लिंक किए गए फ्रेमवर्क और लाइब्रेरीज़" में .a जोड़ें> लक्ष्य> सामान्य (और इसलिए एक्सकोड> लक्ष्य> चरणों का निर्माण> "लाइब्रेरी के साथ लिंक बाइनरी" भी) और एक्सकोड>। लक्ष्य> बिल्ड सेटिंग्स> खोज पथ> लाइब्रेरी खोज पथ में .h फाइल पथ को इंडेक्स करें।

लेकिन इसके साथ में मुझे त्रुटि है "ld: प्रतीक आर्किटेक्चर arm64" के लिए नहीं मिला है ठीक उसी तरह XCode: Undefined symbols for architecture arm64 error और मैंने इसके लिए वेब पर पाए गए सभी समाधानों का प्रयास किया, अभी भी कोई रास्ता नहीं है संकलन।

SO!

सुपरपावर्ड हमें उद्देश्य-सी ++ मिश्रण करने और स्विफ्ट प्रोजेक्ट के भीतर अपनी lib का उपयोग करने के लिए एक नमूना ऐप देता है (अगर आप https://github.com/superpoweredSDK/Low-Latency-Android-Audio-iOS-Audio-Engine चाहते हैं तो गिट के लिए एक लिंक यहां दिया गया है)।

यहाँ मैं क्या समझ के साथ नमूना परियोजना के कुछ स्क्रीनशॉट है और क्या मुझे नहीं पता:

Bridging header file Superpowered

कि मैं चाहता हूँ lib के तरीकों में से प्रोटोटाइप के साथ ब्रिजिंग-हैडर फ़ाइल मेरे स्विफ्ट कोड के भीतर उपयोग करने के लिए (मुझे यह पसंद नहीं है लेकिन अगर यह एकमात्र तरीका है ...)।

ViewController file

ViewController फ़ाइल जहां स्विफ्ट में कोड है, और जहां मैं एक महाशक्तिशाली वस्तु ब्रिजिंग-हैडर फ़ाइल को के धन्यवाद बना सकते हैं, और तरीकों कि मैं इसे में डाल दिया है कहते हैं।

.mm file

और WTF मैं भी समझ में नहीं आता क्यों इस ऑब्जेक्टिव-सी ++ फ़ाइल यहाँ है और क्या यह शामिल है। यह कहीं से भी नहीं आता है, यहां तक ​​कि उनकी lib फ़ाइलें भी नहीं।

इसे ध्यान में नमूना परियोजना के साथ

तो, मैं अपने खुद के परियोजना बना लिया है, यहाँ कुछ स्क्रीनशॉट है:

Briging-Header-File

ही ब्रिजिंग-हैडर फ़ाइल है कि सिवाय इसके कि मैं शामिल नमूना परियोजना में SuperpoweredIOSAudioIO.h इसलिए मैं SuperpoweredIOSAudioIODelegate का उपयोग कर सकता हूं।

viewController

मेरे ViewController फ़ाइल जहां स्विफ्ट में कोड है, और जहां मैं एक महाशक्तिशाली वस्तु बना सकते हैं ब्रिजिंग-हैडर फ़ाइल को की सराहना करते हैं और तरीकों कि मैं इसे में डाल दिया है कहते हैं।

यहां तक ​​कि यह बहुत अच्छा है, सिवाय इसके कि मैं उदाहरण के लिए SuperpoweredRecorder ऑब्जेक्ट बनाने के लिए नहीं कर सकता।अगर मैं अपने ब्रिजिंग-हैडर फ़ाइल में SuperpoweredRecorder.h फ़ाइल को शामिल करने की कोशिश मैं इन त्रुटियों है:

errors

तो मैंने देखा कि ऐसा इसलिए है क्योंकि SuperpoweredRecorder.h कुछ सीपीपी फ़ाइलें भी शामिल है और मैं के लिए एक आवरण बनाने के लिए सीपीपी (जैसा कि मैंने ब्रिजिंग हेडर के साथ किया था, नहीं?) लेकिन इसमें एक .h और a .mm फ़ाइल शामिल है और मुझे नहीं पता कि मुझे उसमें क्या रखना है। एमएम फ़ाइल (SuperpoweredRecorder.cpp का कोड? लेकिन मुझे इसकी पहुंच नहीं है)

तो हाँ, मैं उन सभी चीजों से थोड़ा उलझन में हूं, क्या आप मुझे यह समझने में मदद कर सकते हैं कि मैं अपने स्विफ्ट प्रोजेक्ट में सभी सुपरपावर्ड lib का उपयोग कैसे कर सकता हूं ?

उत्तर

5

जैसा कि मैंने @ ओमनीप्रोग पर टिप्पणी में कहा था, मैंने सुपरपावर्ड के सीटीओ के साथ थोड़ी सी बातचीत की थी जिसने मुझे नीचे दिए गए समाधान को खोजने में बहुत मदद की।

इसलिए, स्विफ्ट सीधे सी ++ के साथ बातचीत नहीं कर सकता है, लेकिन उद्देश्य-सी के साथ, मुझे उद्देश्य-सी ++ (। मिमी फ़ाइल, सी ++ और ऑब्जेक्टिव-सी के बीच एक मिश्रण) में ऑब्जेक्ट बनाना था जो lib के C++ वर्गों को लपेटता था महाशक्तिशाली।

यहाँ lib से SuperpoweredRecorder वस्तु के साथ एक उदाहरण है:

SuperpoweredRecorderWrapped.h

यहाँ मैं एक ज फ़ाइल जहाँ मैं नाम SuperpoweredRecorderWrapped के साथ अपने आवरण प्रोटोटाइप बनाने के लिए, और मैं भी यह सब में प्रोटोटाइप मैं जिस lib का उपयोग करना चाहता हूं उसके SuperpoweredRecorder के तरीके।

SuperpoweredRecorderWrapped.mm

तो मैं एक नया मीटर फ़ाइल है कि मैं .mm नाम बदलने और मैं इस पर SuperpoweredRecorderWrapped लागू पैदा करते हैं। मैं SuperpoweredRecorderWrapped.h और SuperpoweredRecorder.h दोनों आयात करता हूं। मैं SuperpoweredRecorder ऑब्जेक्ट को _wrapped नामक संपत्ति के रूप में बनाता हूं और मेरी विधियों में, मैं _wrapped ऑब्जेक्ट की इसी विधि को कॉल करता हूं। इसके साथ, जब मैं अपने स्विफ्ट कोड में SuperpoweredRecorderWrapped के start पर कॉल करूंगा, तो यह , SuperpoweredRecorder ऑब्जेक्ट पर कॉल करेगा। चाल देखें?

Bridge-Header

और अंत में मुझे लगता है कि जैसे मैं स्विफ्ट से मेरी लिपटे वस्तुओं का दृष्टांत कर सकते हैं मेरी ब्रिजिंग-हैडर में सभी लिपटे कक्षाएं, शामिल हैं।

नोट: सभी सी ++ कोड .mm फाइलों में रहना होगा, यही कारण है कि मैं कर मेरी ज है कि मेरे .mm फ़ाइल में और मेरे ज फ़ाइल में नहीं सी ++ कोड है उसका #include

0

मुझे आश्चर्य है कि आपको विधि के प्रोटोटाइप प्रदान करना होगा। मैंने अपने स्विफ्ट प्रोजेक्ट में ऑब्जेक्टिव सी लाइब्रेरी का इस्तेमाल किया था और मुझे केवल अपने ब्रिजिंग हेडर में हेडर फाइलें जोड़नी पड़ीं।

मेरी परियोजना से उदाहरण देखें। ब्रिजिंग हैडर सिर्फ इतना है कि शामिल हैं:

// Use this file to import your target's public headers that you would like to expose to Swift. 
// 

#import "QTouchposeApplication.h" 
#import <FBSDKCoreKit/FBSDKCoreKit.h> 
#import <FBSDKLoginKit/FBSDKLoginKit.h> 
#import <VungleSDK/VungleSDK.h> 
+0

हां, मुझे कोई समस्या नहीं है और न ही जब मैं उद्देश्य-सी पुस्तकालयों का उपयोग करता हूं लेकिन यहां, lib को C++ में लिखा गया है और यह चीजों को सेट करने के लिए और अधिक दर्दनाक बनाता है। –

+0

आप सही हैं, मुझे आपकी मूल पोस्ट से यह नहीं मिला, लेकिन @ ओमनीप्रोग के जवाब को देखते हुए यह अब समझ में आता है। अपना समाधान पोस्ट करने के लिए धन्यवाद! –

3

मैं ऑब्जेक्टिव-C++ प्रोग्राम नहीं है, लेकिन मैं इतना यहाँ सी, सी ++, ऑब्जेक्टिव-सी, और स्विफ्ट के साथ अनुभव है, कुछ टिप्पणियों और विचारों के आधार पर कर रहे हैं सुपरपावर्ड एसडीके और नमूना कोड देख रहे हैं।

एक ब्रिजिंग हेडर सीधे स्विफ्ट इंटरफेस को उद्देश्य-सी के साथ देता है, और चूंकि उद्देश्य-सी सी का सख्त सुपरसेट है, यह सी के साथ इंटरफेसिंग का तात्पर्य है। हालांकि, आप सी ++ के साथ सीधे इंटरफेस नहीं कर सकते हैं, और यही वह जगह है जहां उद्देश्य-सी ++ बचाव के लिए आता है। जो मैं देख रहा हूं उससे आप उद्देश्य-सी और सी ++ कोड को उद्देश्य-सी ++ में मिश्रित कर सकते हैं, जो उद्देश्य-सी को C++ कक्षाओं का उपयोग करने की अनुमति देता है।

अब कुछ विशिष्टताओं पर।

SuperpoweredFrequencies उदाहरण है कि आप को देखा में ब्रिजिंग हैडर का परिचय एक नई ऑब्जेक्टिव-सी वर्ग, Superpowered, जो लाइब्रेरी का हिस्सा नहीं है, लेकिन उदाहरण के लिए, और Superpowered.mm में कार्यान्वित किया जाता। यह एक उद्देश्य-सी ++ फ़ाइल है, क्योंकि Superpowered कुछ सी ++ कोड कॉल करता है।

#import "SuperpoweredFrequencies-Bridging-Header.h" 
#import "SuperpoweredIOSAudioIO.h" 

के साथ-साथ C और C++ हेडर:

#include "SuperpoweredBandpassFilterbank.h" 
#include "SuperpoweredSimple.h" 

हम import बजाय include इस्तेमाल किया जा सकता था

Superpowered.mm को देखते हुए, आप देखेंगे कि यह ऑब्जेक्टिव-सी हेडर का आयात करता है देखेंगे सी ++ कोड भी, लेकिन वे शायद include का उपयोग कर रहे हैं ताकि यह जोर दिया जा सके कि यह सी ++ कोड है। SuperpoweredBandpassFilterbank.h पर देखकर, हम देखते हैं कि SuperpoweredBandpassFilterbank एक सी ++ कक्षा है। इसका उपयोग में Superpowered उद्देश्य-सी ++ वर्ग द्वारा किया जाता है, filters सदस्य देखें, जो SuperpoweredBandpassFilterbank ऑब्जेक्ट का सूचक है।

जिस परियोजना में आपने निर्माण करने का प्रयास किया था, मुझे लगता है कि Superpowered इंटरफ़ेस ब्रिजिंग हेडर में घोषित किया गया है, लेकिन मुझे कार्यान्वयन नहीं दिखाई देता है। #import SuperpoweredRecorder.h की विफलता SuperpoweredRecorder.h एक C++ शीर्षलेख होने के कारण है। #include आपके उद्देश्य-सी ++ (। मिमी) फ़ाइल में होना चाहिए, यह ब्रिजिंग हेडर में बेकार है, क्योंकि स्विफ्ट किसी भी तरह से C++ का एहसास नहीं कर सकता है।

उम्मीद है कि यह सहायक है।सी ++ की दुनिया में आपका स्वागत है।

+1

सुपरपावर्ड के सीटीओ के साथ समय और थोड़ी सी बातचीत के बाद, मैंने जो कुछ भी समझाया है उसे समझा है और इसके साथ मुझे समाधान मिला है जो मैं कुछ मिनटों में पोस्ट करूंगा। लेकिन अब चीजें स्पष्ट हैं, धन्यवाद! –

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