मैं एंड्रॉइड एनडीके का उपयोग कर जावा ऐप में उपयोग के लिए साझा लाइब्रेरी का निर्माण कर रहा हूं। रिलीज बिल्ड द्वारा उत्पन्न lib/armeabi-v7a/libXXXlib.so
फ़ाइल का निरीक्षण करने के लिए readelf
का उपयोग करके, ऐसा लगता है कि मेरे मूल सी/सी ++ कोड के सभी प्रतीकों (फ़ंक्शन, वेरिएबल नाम) शामिल हैं।क्या एंड्रॉइड एनडीके के साथ निर्मित साझा लाइब्रेरी से प्रतीकों को हटाना संभव है?
दरअसल, साझा ऑब्जेक्ट फ़ाइल डीबग और रिलीज बिल्ड के लिए समान प्रतीत होती है। (libs
फ़ोल्डर में उत्पादन में फर्क सिर्फ इतना किया जा रहा है या नहीं, gsb.setup
और gdbserver
फ़ाइलें बनाए जाते हैं।) मैं अपने Application.mk
में अनुकूलन एक APP_CFLAGS += -O3
साथ NDK द्वारा निर्धारित अधिभावी हूँ, लेकिन मैं रिहाई के निर्माण की अपेक्षा नहीं -g
ध्वज सहित डीबग प्रतीकों को उत्पन्न करने के लिए, जो यह करता है।
मैं इतना 'In both cases, debug and release, it leaves the -g flag in because, to quote the comment, "we generate symbol versions of the binaries that are later stripped when they are copied to the final project's libs/ directory"' बताते हुए, और एक अन्य बताते हुए पर एक टिप्पणी पाया: 'JNI cannot find the functions for java if they don't have names.'
ndk-build
निश्चित रूप से, obj/armeabi-v7a/libXXXlib.so
फ़ाइल से कुछ अलग करना है कि के रूप में अंत में libs
में बनाया से काफी अधिक है, लेकिन यह अभी भी ऐसा लगता है कि फाइल में मेरे सभी कार्यों और चर के नामों को बरकरार रखा जा रहा है।
सभी जेएनआई द्वारा आवश्यक मेरे कार्यों के नाम (केवल मूल कोड में प्रविष्टि-बिंदुओं के बजाय)?
यदि नहीं, तो मैं उन प्रतीकों को कैसे हटा सकता हूं जिनकी आवश्यकता नहीं है?
इसके अलावा जरूरत के लिए डिफ़ॉल्ट दृश्यता = छिपा हुआ है, और सेट विशेषता दृश्यता = डिफ़ॉल्ट सेट करने के लिए स्वतंत्र महसूस, यदि आप, आप डॉन JNI तरीकों में से स्पष्ट पंजीकरण का उपयोग उन लोगों को भी दिखने की ज़रूरत नहीं है। Http://developer.android.com/training/articles/perf-jni.html#native_libraries देखें। – fadden
धन्यवाद @ एलेक्स-कोह्न, @fadden। मैंने अपने 'एंड्रॉइड.एमके' में ''LOCAL_CFLAGS'' पर 'दृश्यता = छुपा' जोड़ा और यह जेएनआई एंट्री-पॉइंट्स से निर्यात किए जा रहे सभी प्रतीकों * अलग * को हटा दिया। (इसलिए मैंने जेएनआई_ऑनलोड में जेएनआई विधियों के स्पष्ट पंजीकरण की स्थापना नहीं की है।) क्या आप जानते हैं कि उन कार्यों पर दृश्यता क्या निर्धारित कर रही है? – Rich
इसके अलावा, क्या आप जानते हैं कि यह डिफ़ॉल्ट रूप से ndk-build द्वारा रिलीज़ बिल्ड के लिए क्यों सेट नहीं किया गया है? – Rich