JNI

2009-11-11 10 views
7

के माध्यम से एक एप्लेट से एक DLL कॉलिंग मैं काम का टुकड़ा है कि कुछ अपरिचित क्षेत्र में पार एक "अवधारणा का सबूत है"। मुझे एक ईएफटीपीओएस मशीन को हमारे इंट्रानेट पर ब्राउज़र में एप्लेट के रूप में चलाने वाले एप्लिकेशन से जोड़ने के लिए काम सौंपा गया है।JNI

मैंने इस पल के लिए EFTPOS डीएल को अनदेखा कर दिया है और मेरी पसंद की भाषा (डेल्फी) में एक साधारण जेएनआई सजाया डीएलएल बनाया है जो सी: \ में एक टेक्स्ट फ़ाइल में स्ट्रिंग लॉग करता है और मैं इसे सफलतापूर्वक कॉल कर सकता हूं स्थानीय जावा अनुप्रयोग।

हालांकि, जब मैं एक ही काम करने के लिए एक एप्लेट बना देता हूं, तो इसे एक .JAR में संकलित करें, JAR & पर हस्ताक्षर करें वेब पेज पर जावास्क्रिप्ट के माध्यम से एप्लेट में विधि को कॉल करने का प्रयास करें।

एक वरिष्ठ जावा पुरुष के साथ मैं काम कर रहा हूँ लगता नहीं है कि यह यह स्वाभाविक है "" बुराई एक एप्लेट यह करने के लिए अनुमति देने के लिए, क्योंकि यह काम करने के लिए प्राप्त करने के लिए संभव नहीं होगा।

एक प्रवेश आप एक java.policy फाइल में डाल सकते हैं LoadLibrary अनुमति देने के लिए नहीं है। साथ ही allPermission & के रूप में मैं बिल्कुल भी जावा कंसोल में निम्न त्रुटि का पता लगाने के उत्पादन फायदा उन पंक्तियों के साथ रूपों की एक पूरी मेजबान की कोशिश की है: जावा:

java.lang.ExceptionInInitializerError 
    at app.TestApplet.LogAString(Unknown Source) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) 
    at java.lang.reflect.Method.invoke(Unknown Source) 
    at sun.plugin.javascript.JSInvoke.invoke(Unknown Source) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) 
    at java.lang.reflect.Method.invoke(Unknown Source) 
    at sun.plugin.javascript.JSClassLoader.invoke(Unknown Source) 
    at sun.plugin.com.MethodDispatcher.invoke(Unknown Source) 
    at sun.plugin.com.DispatchImpl.invokeImpl(Unknown Source) 
    at sun.plugin.com.DispatchImpl$1.run(Unknown Source) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at sun.plugin.com.DispatchImpl.invoke(Unknown Source) 
Caused by: java.security.AccessControlException: access denied (java.lang.RuntimePermission loadLibrary.DLoggerImpl) 
    at java.security.AccessControlContext.checkPermission(Unknown Source) 
    at java.security.AccessController.checkPermission(Unknown Source) 
    at java.lang.SecurityManager.checkPermission(Unknown Source) 
    at java.lang.SecurityManager.checkLink(Unknown Source) 
    at java.lang.Runtime.loadLibrary0(Unknown Source) 
    at java.lang.System.loadLibrary(Unknown Source) 
    at app.DLogger.<clinit>(Unknown Source) 
    ... 16 more 
java.lang.Exception: java.lang.ExceptionInInitializerError 
    at sun.plugin.com.DispatchImpl.invokeImpl(Unknown Source) 
    at sun.plugin.com.DispatchImpl$1.run(Unknown Source) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at sun.plugin.com.DispatchImpl.invoke(Unknown Source) 

कुंजी लाइन "की वजह से हो रहा है। security.AccessControlException: एक्सेस अस्वीकार (java.lang.RuntimePermission loadLibrary.DLoggerImpl) "जो एक अनुमति समस्या का तात्पर्य है। यह हो सकता है कि मैं नीति फ़ाइल गलत हो रही है - या हस्ताक्षर करने के गलत - या सामान की तरह या यह हो सकता है कि जावा hardwired है क्योंकि सुरक्षा जोखिम का एक एप्लेट के लिए अनुमतियों के उन प्रकार की अनुमति नहीं।

मेरा प्रश्न मैं अपना समय बर्बाद कर रहा है? क्या यह & किया जा सकता है यदि हां, तो कैसे?

प्रत्याशा में धन्यवाद

माइक

+0

मुझे लगता है कि यह उल्लेखनीय है कि हमारे जावा एप्लेट जो डीएलएल लोड करता है, ग्राहकों का एक बड़ा प्रतिशत (9 5%) किसी भी समस्या के बिना एप्लेट निष्पादित कर सकता है। तो इस व्यवहार के लिए कुछ अन्य स्पष्टीकरण होना चाहिए, कुछ प्रकार के ब्राउज़र/जेवीएम/ओएस संयोजन जो इस प्रभाव का कारण बनते हैं। – davidecr

उत्तर

14

आप निश्चित रूप से ऐसा कर सकते हैं। मेरे पास उत्पादन में एक काम कर रहे एप्लेट है जो वास्तव में करता है। भले ही आपका ऐपलेट हस्ताक्षरित हो, फिर भी आपको डीएलएल तक पहुंचने के लिए एक्सेस कंट्रोलर का उपयोग करने की आवश्यकता है, आप केवल "loadlibrary" को कॉल नहीं कर सकते हैं। आप इसे जावा नीति फ़ाइल में जोड़ सकते हैं, हालांकि इसकी अनुशंसा नहीं की जाती है। आपके पास शायद जावा कॉन्फ़िगरेशन तक पहुंच नहीं है। 2. भले ही यह आपकी कंपनी के उपयोग के लिए है, पॉलिसी फाइल का प्रबंधन करना एक दर्द है क्योंकि उपयोगकर्ता कुछ जेआरई डाउनलोड करेंगे और आपकी पॉलिसी फाइल या तो ओवरराइट या अनदेखा की जाएगी।

आप अपने लोड लाइब्रेरी कोड को इस तरह के कोड के विशेषाधिकार प्राप्त ब्लॉक में लपेटने के लिए सुनिश्चित करते हुए अपने जार पर हस्ताक्षर करना चाहते हैं।

try 
{ 
    AccessController.doPrivileged(new PrivilegedAction() 
    { 
     public Object run() 
     { 
      try 
      { 
       // privileged code goes here, for example: 
       System.load("C:/Program Files/.../Mydll.dll"); 
       return null; // nothing to return 
      } 
      catch (Exception e) 
      { 
       System.out.println("Unable to load Mydll"); 
       return null; 
      } 
     } 
    }); 
} 
catch (Exception e) 
{ 
    System.out.println("Unable to load Mydll"); 
} 

आप भी System.loadlibrary (mydll.dll) का उपयोग कर सकते हैं, लेकिन आप खिड़कियों में रास्ते पर dll फ़ोल्डर है ताकि एप्लेट इसे पा सकते हैं।

यदि आपको जेएनआई कार्यों को कॉल करने के लिए कुछ स्रोत नमूने की आवश्यकता है तो मुझे बताएं कि मैं इसे भी पकड़ सकता हूं।

0

केवल एक चीज मैं कर सकते हैं सुझाव है कि क्षेत्र के लिए स्रोत कोड पर एक नज़र ले रहे हैं और अगर यह अनुमति के या क्योंकि उस कमी की वजह से अनुमति नहीं दे रहा समझने के लिए कोशिश कर रहा है बिल्कुल अनुमति नहीं है। दुर्भाग्यवश आपके पास लाइन नंबर नहीं हैं, जिससे यह थोड़ा और मुश्किल हो जाता है।

+0

मैं जा रहा हूं - मुझे शुभकामनाएं – mcottle

0

मुझे पूरा यकीन है कि आप एक ऐप्पल से देशी लाइब्रेरी लोड नहीं कर सकते हैं जब तक कि यह "हस्ताक्षरित" न हो, और फिर उपयोगकर्ता को अनुमति या अस्वीकार करने के लिए स्वीकृति संवाद मिलेगा। ऐसा लगता है कि आप एक एप्लेट में जेएनआई कर सकते हैं ... कभी कोशिश नहीं की।

शुभकामनाएं।

+1

एप्लेट का हस्ताक्षर। समस्या या तो 1 तक उबालती है) मैंने अनुमतियों को सही तरीके से नहीं लिखा है। 2) यह कहीं जावा में हार्डवार्ड है कि यह नहीं किया जा सकता है। – mcottle

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