दिलचस्प पोस्ट
एंड्रॉइड एप्लिकेशन के प्रदर्शन का परीक्षण कैसे करें? क्या मैं एक घुमावदार तल के साथ एक div बना सकता हूँ? एक छवि को उत्तरदायी बनाएं – आसान तरीका Windows 7 पर डिफ़ॉल्ट लायब्रेरी में आर पैकेज को अपडेट करने में असमर्थ IOS 10.3: NSStrikethroughStyleAttributeName प्रदान नहीं किया गया है यदि NSMutableAttributedString के उप श्रेणी पर लागू किया गया है मैं एक सूची के माध्यम से दो लूप कैसे करूं? ElementTree का उपयोग कर एक्सएमएल फाइलों को सहेजना FileNameExtensionFilter के साथ File.listFiles का उपयोग करना एक कस्टम सूची में बाध्यकारी WPF कॉम्बो बॉक्स क्या टीएलएस 1.2 के एनटीटी कार्यान्वयन हैं? एन्कोडिंग का पता लगाएं और सब कुछ UTF-8 करें रीसेट या MySQL रूट पासवर्ड को कैसे बदलें? MySQL पूर्णांक बनाम दिनांक समय सूचकांक सी # डिक्शनरी वैल्यू क्लीयरिंग है जब मैं सूची को पूर्व में निर्दिष्ट करता हूँ … क्यों? एक स्थिर सरणी के आकार को चर क्यों नहीं बनाया जा सकता?

लिनक्स पर एक जेएनआई आवेदन के लिए गतिशील पुस्तकालय कैसे संकलित करें?

मैं उबंटु 10.10 का उपयोग कर रहा हूँ

तो यही मैंने किया था।

नमस्कार.जावा :

class Hello { public native void sayHello(); static { System.loadLibrary("hellolib"); } public static void main(String[] args){ Hello h = new Hello(); h.sayHello(); } } 

फिर मैं follwing आदेश दौड़ा:

 dierre@cox:~/Scrivania/provajni$ javac Hello.java dierre@cox:~/Scrivania/provajni$ javah -jni Hello 

मैंने Hello.class और Hello.h प्राप्त किया है।

हैलो :

 /* DO NOT EDIT THIS FILE - it is machine generated */ #include <jni.h> /* Header for class Hello */ #ifndef _Included_Hello #define _Included_Hello #ifdef __cplusplus extern "C" { #endif /* * Class: Hello * Method: sayHello * Signature: ()V */ JNIEXPORT void JNICALL Java_Hello_sayHello (JNIEnv *, jobject); #ifdef __cplusplus } #endif #endif 

फिर मैंने Hello.cpp बनाया:

 #include <jni.h> #include "Hello.h" #include <iostream> using namespace std; JNIEXPORT void JNICALL Java_Hello_sayHello (JNIEnv *env, jobject obj) { cout << "Hello World!" << endl; return; } 

और अब वह हिस्सा जहां मुझे लगता है कि मैं खराब हो गया मुझे इस मार्गदर्शिका ( डायनामिक या साझा ऑब्जेक्ट लायब्रेरी अनुभाग संकलित करें) से प्रेरित था:

 dierre@cox:~/Scrivania/provajni$ gcc -I"/usr/lib/jvm/java-6-sun/include" -I"/usr/lib/jvm/java-6-sun/include/linux" -o hellolib.so -shared -Wl,-soname,hello.so Hello.cpp -static -lc 

जो फ़ाइल hellolib.so उत्पन्न करता है

लेकिन जब मैं इसे java Hello साथ चलाने की कोशिश करता हूं तो मुझे यह त्रुटि है:

 Exception in thread "main" java.lang.UnsatisfiedLinkError: no hellolib in java.library.path at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1734) at java.lang.Runtime.loadLibrary0(Runtime.java:823) at java.lang.System.loadLibrary(System.java:1028) at Hello.<clinit>(Hello.java:4) Could not find the main class: Hello. Program will exit. 

मैंने यह भी कोशिश की:

  LD_LIBRARY_PATH=`pwd` export LD_LIBRARY_PATH 

कोई परिणाम नहीं के साथ

मुझे पता है कि मैं बहुत बेवकूफ कुछ कर रहा हूं लेकिन मुझे पता नहीं है कि यह क्या है। डायरेक्टिव लिब-शेयर्ड विकल्प से उत्पन्न होता है, है ना?

अपडेट # 1

मैंने static { System.load("/home/dierre/Scrivania/provajni/hellolib.so"); } static { System.load("/home/dierre/Scrivania/provajni/hellolib.so"); } यह देखने के लिए कि वह काम करता है, लेकिन अब:

 Exception in thread "main" java.lang.UnsatisfiedLinkError: /home/dierre/Scrivania/provajni/hello.so: /home/dierre/Scrivania/provajni/hello.so: undefined symbol: _ZSt4cout at java.lang.ClassLoader$NativeLibrary.load(Native Method) at java.lang.ClassLoader.loadLibrary0(ClassLoader.java:1803) at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1699) at java.lang.Runtime.load0(Runtime.java:770) at java.lang.System.load(System.java:1003) at Hello.<clinit>(Hello.java:4) 

अपडेट # 2 ठीक है, अद्यतन # 1 समस्या को हल करने के लिए, मुझे gcc g++ का उपयोग करना था, जाहिर है। फिर भी हालांकि load विधि का उपयोग करने में समस्या हो रही है। मैं इसे सही रास्ते बता नहीं सकता

Solutions Collecting From Web of "लिनक्स पर एक जेएनआई आवेदन के लिए गतिशील पुस्तकालय कैसे संकलित करें?"

मूल पुस्तकालय loadLibrary द्वारा एक वैध नाम के साथ लोड किया जा सकता है। उदाहरण के लिए, लिनक्स परिवार के लिए लिनक्स XXXX। इसलिए, आपका नरोलिब.इसलिए libhello.so का नाम बदलना चाहिए वैसे, मैं जावा के साथ जावा विकसित करता हूं, मैं कार्यान्वयन और मूल इंटरफ़ेस (। सी या। सीपीपी) को अलग कर दूंगा।

 static { System.loadLibrary("hello"); // will load libhello.so } 

कार्यान्वयन हेडर (HelloImpl। एच):

 #ifndef _HELLO_IMPL_H #define _HELLO_IMPL_H #ifdef __cplusplus extern "C" { #endif void sayHello (); #ifdef __cplusplus } #endif #endif 

HelloImpl.cpp:

 #include "HelloImpl.h" #include <iostream> using namespace std; void sayHello () { cout << "Hello World!" << endl; return; } 

Hello.c (मैं सी में jni संकलन पसंद करते हैं):

 #include <jni.h> #include "Hello.h" #include "HelloImpl.h" JNIEXPORT void JNICALL Java_Hello_sayHello (JNIEnv *env, jobject obj) { sayHello(); return; } 

अंत में, हम उन्हें कुछ चरणों में संकलित कर सकते हैं:

  1. ओबीजे संकलित करें (हॅलोइंपल.ओ उत्पन्न करें)

जी ++ -सी-आई "/ ऑप्ट / जावा / शामिल करें" -आई "/ ऑप्ट / जावा / शामिल / लिनक्स" हैलोपीप्लुपी

  1. के साथ jni संकलन। ओ

g ++ -i "/ opt / java / include" -i "/ opt / java / include / linux" -o libhello.so-shared-Wl, -सोनाम, नमस्ते.होलो। HelloImpl.o -static -lc

चरण 2 में, हम इसे संकलित करने के लिए जी ++ का उपयोग करते हैं। यह बहुत महत्वपूर्ण है। यार देख सकता है कि कैसे सी और सी ++ मिश्रण करने के लिए

संकलन के बाद, आप एनएम के साथ फ़ंक्शन नामकरण की जांच कर सकते हैं:

 $ nm libhello.so |grep say 00000708 T Java_Hello_sayHello 00000784 t _GLOBAL__I_sayHello 00000718 T sayHello 

एक जावा_होल्लो_सैहेल्लो टी चिह्नित है। यह आपके मूल विधि नाम के बराबर होना चाहिए। अगर सब कुछ ठीक है आप इसे चला सकते हैं:

 $ java -Djava.library.path=. Hello Hello World! 

अंत में मेरा कोड काम करता है यह हैलो। जावा

 public class hello { public native void sayHello(int length) ; public static void main (String args[]) { String str = "I am a good boy" ; hello h = new hello () ; h.sayHello (str.length() ) ; } static { System.loadLibrary ( "hello" ) ; } } 

आपको उसे संकलित करना चाहिए:

 $ javac hello.java 

.h फ़ाइल बनाने के लिए आपको यह कमांड चलाना चाहिए:

 $ javah -jni hello 

यह hello.h है hello.h :

 JNIEXPORT void JNICALL Java_hello_sayHello (JNIEnv *, jobject, jint); 

यहां hello.c :

 #include<stdio.h> #include<jni.h> #include "hello.h" JNIEXPORT void JNICALL Java_hello_sayHello (JNIEnv *env, jobject object, jint len) { printf ( "\nLength is %d", len ); } 

इसे संकलित करने के लिए और साझा लाइब्रेरी बनाने के लिए हमें यह कमांड चलाना होगा:

 $ gcc -I/usr/lib/jvm/java-6-openjdk/include -o libhello.so -shared hello.c 

आखिरकार यह एक चलाएं:

 $ java -Djava.library.path=. hello 

यह C ++ प्रतीक उपलब्ध नहीं होने के बारे में शिकायत करता है। मुझे याद आ रहा है, जब मैं जेएनआई सामान को हर समय सी + + पुस्तकालयों में जोड़ने में समस्याएं करता था और हम हमेशा सादे पुराने सी

यदि आप अपना कोड बदलते हैं, तो यह मानक सी है (और फ़ाइल का नाम बदलें):

 #include <jni.h> #include "Hello.h" #include <stdio.h> JNIEXPORT void JNICALL Java_Hello_sayHello (JNIEnv *env, jobject obj) { printf("Hello World"); return; } 

और इसे संकलित करें

 gcc -I/usr/lib/jvm/java-6-openjdk/include -o libhellolib.so -shared Hello.c 

यह काम करता हैं

 java -Djava.library.path=`pwd` Hello Hello World