2009-05-04 12 views
46

मैं जावा फ़ंक्शन को सी ++ एप्लिकेशन से कैसे कॉल कर सकता हूं?सी ++ से जावा फ़ंक्शंस को कैसे कॉल करें?

मुझे उन्हें सीएमडी (या इसी तरह की तकनीक) से कॉल करने के बारे में पता है, लेकिन मैं उनका उपयोग नहीं करना चाहूंगा।

उत्तर

20

उदाहरण के लिए, जाँच Creating a JVM from C। यह एक जेवीएम बनाने और एक विधि का आह्वान करने के लिए एक नमूना प्रक्रिया दिखाता है। यदि JVM पहले से मौजूद है; जैसे आपका सी प्रोग्राम जावा प्रोग्राम (कॉलबैक स्थिति) द्वारा लगाया जाता है, आप जेएनआईएनएनवी * पॉइंटर को कैश कर सकते हैं।

सलाह के रूप में, सी/सी ++ से जेवीएम को सावधानीपूर्वक कैशिंग पॉइंटर्स सावधान रहें, इसमें कुछ अर्थशास्त्र शामिल हैं जो आप कैश कर सकते हैं और बाद में इसे लागू किया जा सकता है। इसके लिए, ब्रायन एग्नेव ने बताया, जेएनआई संदर्भ की जांच करें।

+0

इस प्रकार का आमंत्रण वह है जिसे मैं ढूंढ रहा हूं। प्रश्न यह है कि – user63898

+0

जटिलता इस विधि का क्या है। लेकिन मेरा मानना ​​है कि, तीसरे पक्ष के औजारों के बिना, मैंने जो पढ़ा है उससे एकमात्र तरीका है। – bbqchickenrobot

2

JNI पर पढ़ें।

+3

मुझे पता है कि जेएनआई का उपयोग कर जावा से सी ++ फ़ंक्शंस को कॉल करना संभव है, लेकिन आप जावा फ़ंक्शन को C++ से कॉल करने के लिए इसका उपयोग कैसे कर सकते हैं? –

+0

@AndersonGreen हाँ सी ++ से जावा विधियों को कॉल करना संभव है। दुर्भाग्यवश, जावा से सी ++ को कॉल करने के बारे में वहां बहुत अधिक जानकारी है, लेकिन मुझे कुछ ट्यूटोरियल मिले हैं, http://www.ibm.com/developerworks/java/tutorials/j-jni/section3.html और http: //www.codeproject.com/Articles/22881/How-to-Call-Java-Functions-from-C-Using-JNI। मुझे प्रत्येक ट्यूटोरियल के साथ कुछ समस्याएं थीं, और विशेष रूप से आईबीएम ट्यूटोरियल में कुछ परेशान असंगतताएं हैं, लेकिन इस समय मुझे ये सबसे अच्छा मिल सकता है। – StockB

15

JNI Invocation interface देखें। यह आपको अपने सी (या सी ++) एप्लिकेशन के भीतर एक जेवीएम एम्बेड करने की अनुमति देगा।

ध्यान दें कि जावा से कॉलिंग सी/सी ++ को सुविधाजनक बनाने के लिए विभिन्न आसान तंत्र मौजूद हैं (उदा। JNA)। यह आपकी समस्या inverting ऐसी है कि आप जावा से कॉल कर सकते हैं पर विचार लायक हो सकता है (मैं समझता हूँ कि यह अच्छी तरह से नहीं अपने विशेष आवेदन के लिए संभव हो सकता है, हालांकि)

+1

यह आपकी गलती नहीं है, लेकिन जेएनआई इंफोकेशन इंटरफ़ेस लिंक टूटा हुआ है।ऐसा लगता है कि ओरेकल ने उनके जेएनआई संसाधन को स्थानांतरित कर दिया था, क्योंकि जेएनआई सूचना की तलाश करते समय टूटे हुए लिंक पूरे स्थान पर हैं। – StockB

+0

ऐसा लगता है कि यह लिंक अब तय किया गया है –

1

सूर्य में very good and basic example of JNI है। http://hildstrom.com/projects/jni/index.html

मान लीजिए आप एक जावा वर्ग है:

+12

डेडलिंक। कृपया – learnvst

+0

अपडेट करें यह आलेख की एकमात्र काम करने वाली प्रति है जिसे मैं Google के साथ पा सकता हूं: http://enos.itcollege.ee/~jpoial/oop/lugemist/JDCBook/JDCBook/jniexamp.html – mrt

3

इस पृष्ठ उपयोगी है

package foo; 
public class bar { 
    public static int timesTen(int input){ 
     return input * 10; 
    } 
} 

बार जब आप एक JVM और JNIEnv * (विवरण छोड़े गए ...) आप जावा विधि आह्वान कर सकते हैं C++ से इस प्रकार है:

jclass myClass = env->FindClass("foo.bar"); 
jmethodID mid = env->GetStaticMethodID(myClass, "timesTen", "(I)I"); 
jint hundred = env->CallStaticIntMethod(myClass, mid, (jint)10); 

इस विस्तार की बहुत एक से अधिक glosses, सहित अपवाद हैंडलिंग, जो छोड़ा गया है तो आपके JVM को क्रैश करेगा। सभी भौगोलिक विवरणों के लिए "जावा मूल इंटरफ़ेस" पर खोजें और ओरेकल लिंक का पालन करें।

+4

जबकि यह लिंक उत्तर दे सकता है प्रश्न, यहां उत्तर के आवश्यक हिस्सों को शामिल करना बेहतर है और संदर्भ के लिए लिंक प्रदान करना बेहतर है। लिंक किए गए पृष्ठ में परिवर्तन होने पर लिंक-केवल उत्तर अमान्य हो सकते हैं। – Perception

-2

सीपीपी से जावा विधियों को कॉल करने का एक और आसान तरीका बैच फ़ाइल के माध्यम से है।

system() 

सीपीपी से एक्सई या बैट फाइलों को कॉल करने का तरीका है। अपनी कक्षा को जावा पथ और बैच फ़ाइल में क्लासपाथ के साथ रखें और system("batch-file-name.bat") का उपयोग करके सीपीपी से उस बैच फ़ाइल को कॉल करें।

यह आसान और सीधा आगे है।

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