2012-02-28 8 views
9

से कॉलिंग सी ++ डीएल कॉलिंग मैं जावा का उपयोग एक छोटे ऐप के लिए कर रहा हूं। यह मौजूदा एमएफसी परियोजना का पुनर्लेखन है। जेएनआई का उपयोग कर जावा से एक्सेस सक्षम करने के लिए मुझे एक मौजूदा डीएलएल बदलने की जरूरत है। यह सभी जावा सामान मेरे लिए नया है, इसलिए जब मैं अन्य फ़ोरम पोस्ट पढ़ता हूं तो मुझे थोड़ा परेशानी होती है और मुझे घना महसूस होता है। मौजूदा डीएल में मेरे पास एक फ़ंक्शन है:जावा

extern "C" __declspec(dllexport) bool Create() 
{ 
    return TRUE; 
} 

गूंगा प्रश्न समय। जावा द्वारा बुलाए जाने के लिए मैं इसे ठीक से कैसे सेट करूं?

JNIEXPORT jboolean JNICALL Create() 
{ 
    return TRUE; 
} 

मैं jni.h और सब कुछ ठीक संकलित शामिल कर रहा हूँ:

मैं इस कोशिश की। हालांकि, जब मैं इसे जावा से कॉल करता हूं तो मुझे असंतुष्ट लिंक्स त्रुटि मिलती है।

public static native boolean CreateSession(); 

System.load("D:\\JavaCallTest.dll"); 
Create(); 

किसी कृपया उचित दिशा में मुझे धक्का सकता है: मैं इस का उपयोग कर जावा से यह फोन कर रहा हूँ? मैं ईमानदारी से किसी भी मदद की सराहना करता हूं। एक मौजूदा सी Codebase जो मैं जावा से पहुंच के लिए आवश्यक -

धन्यवाद,

निक

+1

क्या आपने सूर्य उदाहरण देखा है? http://java.sun.com/developer/onlineTraining/Programming/JDCBook/jniexamp.html – Etienne

+1

वैकल्पिक रूप से, आप जेएनआई के बजाय जेएनए का उपयोग कर सकते हैं क्योंकि आपके पास सी डीएल है जिसे जेएनए द्वारा लोड किया जा सकता है। – ecle

+0

कृपया जो अपवाद फेंक दिया गया है उसे पोस्ट करें ... – quaylar

उत्तर

7

आप अगर अपनी मूल विधि के रूप में जावा में घोषित किया गया था उदाहरण के लिए, जावा वर्ग के नाम और अपने मूल कोड में पथ शामिल करने की जरूरत है:

public class NativeCode { 
    public static native boolean CreateSession(); 
} 

और वर्ग पथ (उदाहरण के लिए) था com.example.NativeCode तुम करोगी इस प्रकार मूल में अपनी प्रणाली की घोषणा:

extern "C" 
JNIEXPORT jboolean JNICALL Java_com_example_NativeCode_CreateSession(JniEnv* env, jclass clazz) 
{ 
    return JNI_TRUE; 
} 

सभी JNI तरीकों एक JNIEnv सूचक और अपने पहले दो पैरामीटर के रूप में वर्ग की है।

+0

वह था। ऐसा लगता है कि अब काम कर रहा है। हम देखेंगे कि जब मैं इस तरह के एक साधारण कार्य से निपट नहीं रहा हूं तो मैं किस तरह के मुद्दों को चलाता हूं। मैं मदद की सराहना करता हूं। – nickfinity

+0

@GooseSerbus सार्वजनिक स्थिर देशी बुलियन CreateSession (?,?) का उपयोग करने वाले पैरामीटर के बारे में क्या है; – Aniket

+0

@ एनीनेट पैरामीटर सी विधि में पैरामीटर पर जोड़े गए हैं उदाहरण: 'सार्वजनिक स्थैतिक देशी बूलियन CreateSession (बूलियन, ऑब्जेक्ट); ' ' जेएनआईएक्सपोर्ट जंबोलियन जेएनआईसीएलएल जावा_कॉम_एक्सएमएल_नेटिवोडोड_CreateSession (JniEnv * env, jclass clazz, jboolean b, jobject o) होगा ' – GooseSerbus

1

मैं एक ऐसी ही समस्या थी। यह SWIG से परिचित होने के लिए मेरे लिए भुगतान किया गया, एक इंटरमीडिएट सी ++ डीएलएल (जो सी-कोड कहता है) उत्पन्न करने के लिए एक उपकरण, साथ ही जावा-कोड जो सी ++ डीएलएल में कॉल कर रहा है।

आप DLL का केवल 1 समारोह की तुलना में अधिक है, तो रैप करने के लिए, इसे बंद भुगतान कर सकते हैं इस उपकरण की जाँच करने के लिए, अन्यथा आप JNI से परिचित भी प्राप्त करना होगा ...

संपादित:

ऐसा लगता है कि आपका DLL System.load() कॉल द्वारा नहीं मिला है। आप System.loadLibrary() आज़मा सकते हैं, लेकिन ध्यान दें कि आपका DLL तब जावा सिस्टम प्रॉपर्टी java.library.path द्वारा निर्दिष्ट पथ में स्थित होना चाहिए। इस मामले में पूर्ण फ़ाइल नाम भी पास न करें, लेकिन विस्तार के बिना फ़ाइल नाम।

+0

यह डीएलएल ढूंढ रहा था, लेकिन मेरे पास मेरे फ़ंक्शन को ठीक से घोषित नहीं किया गया था। मुझे SWIG में देखना होगा। पारितोषिक के लिए धन्यवाद। – nickfinity

2

एक स्थिर देशी पद्धति अभी भी कम से कम दो मापदंडों की जरूरत है:

JNIEnv *env 
jclass clazz 

समारोह नाम भी जावा पैकेज संरचना अनुरूप करना पड़ता है।

JNIEXPORT jboolean JNICALL Java_com_example_CreateSession(JNIEnv *env, jclass clazz) 

आदर्श रूप में, आप जावा वर्ग देशी विधि की घोषणा से एक हैडर फ़ाइल बनाने के लिए javah उपकरण का प्रयोग करेंगे और उसके बाद घोषित समारोह प्रोटोटाइप को लागू।

+0

+1 यह उल्लेख करने के लिए कि जावा को फ़ंक्शन हस्ताक्षर जेनरेट करने के लिए उपयोग किया जाना चाहिए। –

+0

यह मिला (http://stackoverflow.com/a/3452258/978528) और जावा को चलाने के लिए ग्रहण सेटअप करें। अब अच्छा काम कर रहा हूँ। अब मुझे बाकी चीजों को लागू करना है। उम्मीद है कि सीधा होगा। – nickfinity