2011-09-02 14 views
7

मैंने इस प्रश्न को यहां देखा है, प्रस्तावित सुधारों का प्रयास किया है, लेकिन अब तक मेरे लिए कोई सफलता नहीं है। मेरे पास काफी जावा अनुभव है, लेकिन जेएनआई बहुत समय पहले है, हालांकि इसे लिनक्स पर कभी नहीं किया गया ...लिनक्स पर जेएनआई मुद्दा: साझा ऑब्जेक्ट फ़ाइल नहीं खोल सकता

मैं लिनक्स पर चल रहा एक सरल हैलोवर्ल्ड जेएनआई ऐप प्राप्त करने की कोशिश कर रहा हूं।

छोटे जावा फ़ाइल:

class HelloWorld { 

    private native void print(); 

    public static void main(String[] args){ 
     new HelloWorld().print(); 
    } 

    static { 
     System.out.println(System.getProperty("java.library.path")); 
     System.loadLibrary("HelloWorld"); 
    } 

} 

छोटे सी फ़ाइल:

#include <jni.h> 
#include <stdio.h> 
#include "HelloWorld.h" 

JNIEXPORT void JNICALL 
Java_HelloWorld_print(JNIEnv *env, jobject obj) 
{ 
    printf("Hello World!\n"); 
    return; 
} 

संकलित सी फ़ाइल द्वारा:

java HelloWorld 
:

gcc -shared -Wall -fPIC HelloWorld.c -I/usr/lib/gcc/x86_64-redhat-linux/3.4.3/include/ -o libHelloWorld.so 

द्वारा एप्लिकेशन चलाएं

या

java -Djava.library.path=/home/nxp40954/jnitesting/. HelloWorld 

लेकिन अच्छी नहीं है, एक हो रही:

Exception in thread "main" java.lang.UnsatisfiedLinkError: /home/nxp40954/jnitesting/libHelloWorld.so: /home/nxp40954/jnitesting/libHelloWorld.so: cannot open shared object file: No such file or directory 

अजीब है, वास्तव में है क्योंकि वहाँ एक /home/nxp40954/jnitesting/libHelloWorld.so फ़ाइल।

क्या किसी के पास कोई सुराग है? जब .so फ़ाइल लोड नहीं किया जा सकता

export LD_LIBRARY_PATH=. 
java HelloWorld 

java.lang.UnsatisfiedLinkError फेंक दिया जाता है:

उत्तर

7

इस तरह से निष्पादित करें। LD_LIBRARY_PATH चर अंक अतिरिक्त स्थान * .so फ़ाइलों के लिए देखने के लिए।

मैं सूरज जावा के साथ 32 बिट उबंटू पर हूं। मैं इस तरह संकलित कर रहा था:

gcc -shared -Wall -fPIC HelloWorld.c -I/usr/lib/jvm/java-6-sun-1.6.0.26/include -I/usr/lib/jvm/java-6-sun-1.6.0.26/include/linux -o libHelloWorld.so 
+0

हां, मुझे पता है कि libs को पथ को जाना चाहिए जिसे LD_LIBRARY_PATH द्वारा परिभाषित किया गया है, "।" वहाँ में, और यहां तक ​​कि -Djava.library.path =/घर/nxp40954/jnitesting का उपयोग कर मैंने स्पष्ट रूप से परिभाषित जहां libHelloWorld.so स्थित है, लेकिन मैं अभी भी इस "ऐसा कोई फ़ाइल या निर्देशिका" त्रुटि मिलती द्वारा भी है। – Vlemmix

+0

मैं अपने कोड संकलित और यह मेरे लिए काम करता है। क्या आप इसे एक निर्देशिका में करने की कोशिश कर सकते हैं और "।" ? बीटीडब्ल्यू, आप किस जावा का उपयोग कर रहे हैं? वाह ओएस? –

4

आपका उदाहरण 32-बिट लिनक्स स्थापना पर मेरे लिए काम करता था।

क्या आपकी साझा लाइब्रेरी 32-बिट या 64-बिट साझा लाइब्रेरी के रूप में संकलित है? आदेश file libHelloWorld.so से संपर्क करें। आपकी साझा लाइब्रेरी में 64-बिट है तो आप इतना है कि जावा 64-बिट साझा लाइब्रेरी लोड कर सकते हैं जब जावा शुरू कर आदेश पंक्ति विकल्प -d64 देने के लिए की जरूरत है।

यदि आपकी साझा लाइब्रेरी 32-बिट है तो शायद जावा विकल्प -d32 समस्या का समाधान करेगा।

+0

धन्यवाद आदमी! इसके बारे में सोचना चाहिए था। कोई 64-बिट JVM समर्थन नहीं है, लेकिन lib 64-बिट था। जीसीसी में -एम 32 पैरामीटर जोड़ा गया, ठीक है नहीं। धन्यवाद! – Vlemmix

+1

ऑफ-मौके पर यह आपके लिए आपके लिए काम नहीं करता है, सुनिश्चित करें कि आप जावा के 'java.library.path' के बजाय माइकल के उत्तर के अनुसार 'LD_LIBRARY_PATH' पर्यावरण चर निर्दिष्ट करते हैं। ऐसा इसलिए है क्योंकि यदि आपकी लिंक्ड लाइब्रेरी को किसी अन्य लिंक्ड लाइब्रेरी तक पहुंचने की आवश्यकता है, तो उसे यह नहीं मिल पाएगा क्योंकि यह 'java.library.path' के बारे में नहीं जानता है। –

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

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