2012-02-17 12 views
5

एक छोटी सी पृष्ठभूमि: मैं एक जावा अनुप्रयोग है कि मैक पर एक तीसरे पक्ष के हार्डवेयर से बात करने की आवश्यकता है। उन्होंने मुझे एसडीके दिया है लेकिन यह जावा में नहीं है। तो मैं jnilib बनाने की कोशिश कर रहा हूं जो मेरे जावा एप्लिकेशन और एसडीके के बीच एक पुल के रूप में कार्य करेगा।मैक + JNI + जावा

मुद्दा: मैं एक छोटा सा नमूना jnilib कि एसडीके से बात लेकिन बना दिया है जब मैं अपने जावा कार्यक्रम में इसका इस्तेमाल करने की कोशिश मैं निम्न त्रुटि

Exception in thread "main" java.lang.UnsatisfiedLinkError: /Users/john.doe/Desktop/eclipse/workspace/Lesson13_Jni_Smart7/bin/libSmartTest7.jnilib: Library not loaded: build/Release/SMARTResponseSDK.framework/Versions/A/SMARTResponseSDK Referenced from: /Users/john.doe/Desktop/eclipse/workspace/Lesson13_Jni_Smart7/bin/libSmartTest7.jnilib  
Reason: image not found 
    at java.lang.ClassLoader$NativeLibrary.load(Native Method) 
    at java.lang.ClassLoader.loadLibrary0(ClassLoader.java:1827) 
    at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1742) 
    at java.lang.Runtime.loadLibrary0(Runtime.java:823) 
    at java.lang.System.loadLibrary(System.java:1045) 
    at com.learning.lesson13.JniSmart7.<clinit>(JniSmart7.java:6) 

त्रुटि यह की तरह लग रहा से मिलता है मेरी libSmartTest7.jnilib पुस्तकालय SMARTResponseSDK के लिए देख रहा है।

मैंने को आजमाया है, मुझे पता है कि लाइब्रेरी SMARTResponseSDK मेरे मैक पर है। मैंने इसे ग्रहण में अपने काम करने वाले फ़ोल्डर में कॉपी करने की कोशिश की लेकिन मुझे अभी भी त्रुटि मिल गई है। मैंने -DJava.library.path का उपयोग करने का प्रयास किया है लेकिन मुझे अभी भी त्रुटि मिलती है।

क्या सबसे अच्छा संभव दृष्टिकोण होगा पर कोई भी विचार।

+0

पर OSX पुस्तकालय या तो java.library.path या DYLD_LIBRARY_PATH वातावरण चर के भीतर मिल जाना चाहिए। आपको यह सुनिश्चित करने के लिए अपनी लाइब्रेरी भी जांचनी चाहिए कि यह निर्भर पुस्तकालय के लिए एक विशिष्ट पूर्ण पथ का उपयोग नहीं कर रहा है (जब तक कि यह सिस्टम-स्थापित स्थान में न हो)। आपकी टिप्पणी के लिए – technomage

+0

हाय धन्यवाद। मुझे खेद है लेकिन ऐसा लगता है कि यह मेरी गलती थी। दो "SMARTResponseSDK" पुस्तकालय थे। ऐसा लगता है कि मैंने अपनी जेनिलीब बनाते समय गलत इस्तेमाल किया था। मैंने अन्य "SMARTResponseSDK" का उपयोग किया और समस्या को साफ़ कर दिया गया प्रतीत होता है। – user1216750

+0

आप रोकाकोआ पर भी विचार कर सकते हैं, जो आपको किसी भी मूल कोड को लिखने और सीधे जावा से तृतीय-पक्ष लाइब्रेरी तक पहुंचने से बचने देता है। – technomage

उत्तर

0

एक बार जब आप जेएनआई कोड के अंदर हैं, तो यह अब java.library.path अंक पर कोई फर्क नहीं पड़ता।

एक बार जब आप अंदर JNI कोड हैं, तुम सब कर सकते हैं LD_LIBRARY_PATH/DYLD_LIBRARY_PATH के माध्यम से सुनिश्चित करें कि पुस्तकालय द्वारा अपने कोड में दिखाई दे रहा है बनाने के लिए है, या आप गतिशील रूप से आप की तरह किसी भी स्थान से अपनी लाइब्रेरी फ़ाइल को लोड कर सकते हैं।

तो, आप के लिए, मैं एक नज़र यहाँ ले जाने का सुझाव देते हैं: JNI में

- - साझा लाइब्रेरी (अनुकूलक पैटर्न) से http://jnicookbook.owsiak.org/recipe-No-018/
  • कॉलिंग कोड

    आप भी अपनी JNI लाइब्रेरी बनाना, जबकि संकलन झंडे से लाभ और rpath उपयोग कर सकते हैं।

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