2009-11-11 16 views
7

Tanımadığınız bazı bölgelere geçen bir "konsept kanıtı" iş parçam var. Bir EFTPOS makinesini intranetimizde bir tarayıcıda bir uygulama olarak çalışan bir uygulamaya bağlamakla görevlendirildim.JNI aracılığıyla bir Applet'ten bir DLL çağrısı

Şu an için EFTPOS dll'yi göz ardı ettim ve basit bir JNI ile dekore edilmiş DLL'yi kendi dilimde (Delphi) oluşturdum ve bu sadece c: \ içindeki bir metin dosyasına bir dizeyi kaydeder. yerel Java uygulaması.

Bununla birlikte, aynı şeyi yapmak için bir uygulama oluşturduğumda, .JAR içine derleyin, JAR & oturumunu, başarısız olduğu bir web sayfasında Javascript aracılığıyla uygulama yöntemini çağırmayı deneyin.

Çalıştığım üst düzey bir Java kullanıcısı bunun işe yaratabileceğini düşünmüyor çünkü bir uygulamanın buna izin vermesi için doğal olarak "kötü" olduğu için.

YükLibrary'ye izin vermek için java.policy dosyasına yerleştirebileceğiniz bir girdi var. yanı allPermission & gibi tüm Java konsolda aşağıdaki hata iz üreten boşuna bu doğrultuda bir varyasyon bir bütün ana denedim: java:

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) 

anahtar çizgi "Neden Olduğu gibi görünüyor. security.AccessControlException: erişim engellendi (java.lang.RuntimePermission loadLibrary.DLoggerImpl) "bir izin sorunu anlamına gelir. Politika dosyasını yanlış - veya yanlış imzaladığım - ya da bunun gibi şeyleri alıyorum ya da Java'nın güvenlik riski nedeniyle bir Applet için bu tür izinlere izin vermeyecek şekilde yapılandırılmış olması olabilir.

Sorumu vaktimi boşa harcıyorum? Öyleyse, & yapılabilir mi? beklentisiyle

Teşekkür

Mike

+0

Bence java uygulaması ile DLL'leri yüklersek, müşterilerin büyük bir yüzdesi (% 95) herhangi bir sorun olmadan uygulamayı çalıştırabilir. Bu nedenle bu davranışa başka bir açıklama olmalı, bu tür bir etkiye neden olan bir çeşit Tarayıcı/JVM/OS kombinasyonu. – davidecr

cevap

14

Bunu kesinlikle başarabilirsiniz. Tam olarak bunu yapan üretimde çalışan bir uygulamam var. Uygulamanız imzalanmış olsa bile, dll'ye erişmek için hala Erişim Denetleyicisini kullanmanız gerekir, sadece "loadlibrary" olarak adlandırılamaz. Bunu Java ilke dosyasına ekleyebilirsiniz, ancak bu, 1 nedeniyle önerilmez. Muhtemelen java yapılandırmasına erişiminiz yoktur. 2. Bu, kendi şirketinizin kullanımı için olsa bile, politika dosyasını yönetmek kullanıcıların JRE'yi indireceği ve politika dosyanızın üzerine yazıldığından veya yok sayılmasından dolayı bir acıdır.

En iyi yol, kavanozunuzu imzalamak, yük kitaplığı kodunuzu bu gibi bir ayrıcalıklı kod bloğuna sardığınızdan emin olmanızdır.

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"); 
} 

Sen de System.loadlibrary (mydll.dll) kullanabilir ancak uygulaması bulabilirsiniz böylece pencerelerde yolda dll klasörü olması gerekir.

JNI işlevlerini çağırmak için bazı kaynak örneklerine ihtiyacınız varsa, bunu da alabileceğimi bildirin.

0

Ben o alana yönelik kaynak koduna bir göz alarak ve bunun nedeni izni ya çünkü eksikliği izin değilse deşifre etmeye çalışıyor önerebilirsiniz tek şey hiç izin verilmez. Maalesef satır numaranız yok, bu yüzden biraz daha zor hale geliyor.

+0

Ben gidiyorum - bana şans dile – mcottle

0

"İmzalı" olmadığı sürece bir Applet'ten bir yerel kitaplık yükleyemediğinizden eminim, sonra kullanıcı izin vermek veya izin vermemek için bir kabul iletişim kutusu alır. Yani, bir applette JNI yapabileceğinizi varsayarak ... bunu asla denemediniz.

İyi şanslar.

+1

Applet imzalı. Sorun ya 1'e kadar kaynatılıyor. İzinleri doğru yazmamıştım. 2) Java'nın bir yere yapamayacağı bir yere bağlı. – mcottle