JNIEXPORT और JNICALL NDK_ROOT में परिभाषित कर रहे हैं। आपके सेटअप के आधार पर यह पथ अलग होगा, लेकिन अधिकतर समान होगा।
#define JNIIMPORT
#define JNIEXPORT __attribute__ ((visibility ("default")))
#define JNICALL
जेएनआईएक्सपोर्ट का निर्माण देशी बाइनरी (* .so फ़ाइल) की गतिशील तालिका में देशी कार्यों को करने के लिए किया जाता है। उन्हें "छुपा" या "डिफ़ॉल्ट" पर सेट किया जा सकता है (अधिक जानकारी here)। यदि ये फ़ंक्शंस गतिशील तालिका में नहीं हैं, तो जेएनआई उन्हें कॉल करने के लिए फ़ंक्शंस नहीं ढूंढ पाएगा, इसलिए रजिस्टरनेट्स कॉल रनटाइम पर विफल हो जाएगी।
इसलिए किसी को भी काफी आसानी से अपने मूल कोड डिकंपाइल सकता है यह देखते हुए कि सभी कार्यों डिफ़ॉल्ट रूप से गतिशील तालिका में समाप्त हो सकता है। जेएनआई को इसे ढूंढने की जरूरत होने पर हर फंक्शन कॉल बाइनरी में बनाया जाता है। इसे संकलक विकल्प -fvisibility
का उपयोग करके बदला जा सकता है। मैं अनुशंसा करता हूं कि प्रत्येक व्यक्ति आपके कोड को सुरक्षित रखने के लिए इसे -fvisibility=hidden
पर सेट करें, और फिर बाह्य दृश्यता के रूप में कार्यों को ध्वजांकित करने के लिए जेएनआईएक्सपोर्ट का उपयोग करें।
स्ट्रिप कमांड का उपयोग केवल डीबग प्रतीकों को हटा देता है, गतिशील तालिका अलग होती है। Objdump के साथ एक नाटक है यह देखने के लिए कि कोई व्यक्ति आपकी .so फ़ाइलों से कितना बाहर निकल सकता है।
हम हाल ही में इस तक पहुंचे हैं, उम्मीद है कि इससे किसी की मदद मिलेगी।
संपादित करें: हम एक कस्टम बिल्ड सिस्टम का उपयोग करते हैं, इसलिए दृश्यता विकल्प अन्य बिल्ड सेटअप के लिए डिफ़ॉल्ट रूप से सेट किया जा सकता है। अधिक जानकारी this SO answer में उपलब्ध है।
स्रोत
2014-01-30 09:22:42
जेएनआईसीओएल का क्या अर्थ है? – Lealo
जेएनआईसीएएल एंड्रॉइड (उपर्युक्त के रूप में) पर एक खाली परिभाषा है लेकिन यह मंच अनुकूलता के लिए है। विंडोज़ जेडीके पर जेएनआईसीओएल को '__stdcall' (https://msdn.microsoft.com/en-us/library/zxk0tw93.aspx) के रूप में परिभाषित किया गया है। –