2011-12-30 31 views
6

Tôi đang cố truy cập các phương thức dll trong java đã được viết bằng C#. Từ đoạn mã sau tôi đang cố gắng xây dựng dll được tạo thành công.Truy cập các phương thức dll trong java

using System; 
using Microsoft.Win32; 


namespace CyberoamWinHelper 
{ 
    public class RegistryAccess 
    {   
     public static String getValue(String key) 
     { 
      RegistryKey rk = Registry.CurrentUser; 
      RegistryKey rk1=rk.OpenSubKey("Software\\Test", RegistryKeyPermissionCheck.ReadWriteSubTree, System.Security.AccessControl.RegistryRights.FullControl); 
      rk1.SetValue(key, "val1"); 
      return rk1.GetValue(key).ToString(); 
     } 
     public static void createSubkey(String name) 
     { 
      RegistryKey rk = Registry.CurrentUser; 
      rk.CreateSubKey("Software\\Test"); 
     } 
    } 
} 

Sau này tôi đang tải dll được tạo ra trong mã chương trình java của tôi trong số đó là như sau

public class JNI { 

    /** 
    * @param args the command line arguments 
    */ 
    public native String getValue(String key);  

    public static void main(String[] args) { 
     // TODO code application logic here 

     try 
     { 
      System.loadLibrary("CyberoamWinHelper"); 
      JNI j=new JNI();  
      System.out.println(j.getValue("abc")); 
     } 
     catch(UnsatisfiedLinkError e) 
     { 
      System.out.println("Ex" + e.getMessage()); 
     } 
    } 
} 

Sau khi chạy đoạn mã này nó được đem lại cho tôi những lỗi sau.

"Exjni.JNI.getValue(Ljava/lang/String;)Ljava/lang/String;" 

Tôi không hiểu lỗi này nói gì nhưng tôi muốn giải quyết. Và một câu hỏi nữa tôi đang gặp là vì phương pháp tôi đang gọi là một phương pháp tĩnh sẽ được gọi theo cách này? tôi có nghĩa là để gọi phương thức tĩnh chúng ta cần

"ClassName.methodName"

vì vậy đây nó sẽ có thể gọi phương thức?

+0

Bạn cần phải tải thư viện mẹ đẻ của bạn với 'System.loadLibrary()' - tốt nhất là trong một tĩnh initializer – fge

+0

@fge: i đã làm nó . Nó không hoạt động. – ankurtr

+0

Bạn biết tất nhiên là .NET dll không phải là tiêu chuẩn của dll và tự mình không làm việc với JNI. –

Trả lời

7

Bạn chỉ có thể gọi các phương thức qua JNI nếu các phương pháp đó trên thực tế được thiết kế để được gọi theo cách này. Phương pháp của bạn hoàn toàn không. Những gì bạn đang làm ở đây có (xin lỗi để được như vậy cùn) hoàn toàn không có cơ hội bao giờ thành công - nó chỉ đơn giản là không làm việc theo cách này.

Có một số cách bạn có thể tiến hành. Người ta sẽ tìm hiểu về JNI và cách viết thư viện thực sự làm việc với nó. Here là tham chiếu kinh điển cho việc này. Làm điều này với C# cho biết thêm một lớp phức tạp, mặc dù.

Một cách khác là từ bỏ hoàn toàn JNI và sử dụng cơ chế thích hợp hơn để truy cập các phương pháp. Bạn có thể tìm hiểu về JNA tại đây; nó sẽ hoàn toàn phù hợp hơn với mục tiêu của bạn.

+1

@ ankur-trapasiya - đề xuất của Ernest Friedman-Hill là hoàn toàn, hoàn toàn chính xác! Hãy lắng nghe anh ta! – paulsm4

+0

@ paulsm4: tôi đang cố gắng làm điều đó với JNA. – ankurtr

0

Việc sử dụng JNI của bạn không chính xác. Thật khó (mặc dù không phải là không thể) để sử dụng JNI với các thư viện C#. Có một hướng dẫn tuyệt vời về cách đi về nó here. Thực hiện tìm kiếm C# JNI trên Google sẽ tiết lộ nhiều hơn.

Bạn cũng nên điều tra cái gì đó như Grasshopper ..

EDIT

http://caffeine.berlios.de/site/documentation/quickstart.html

là một giải pháp tuyệt vời.

+0

Liên kết đầu tiên tốt không phải là những gì tôi đang cố gắng làm. Đó là về visual C++ và java. Điều đó được thực hiện thông qua JNI nhưng tôi muốn làm điều đó giữa C# và java có hoặc không có JNI. Và trong liên kết thứ hai cũng không có câu trả lời cho câu hỏi của tôi. – ankurtr

+1

JNI không có giao diện trực tiếp với C# .. Bạn phải tạo một C++ stub giữa C# và Java. –

+0

OOooh tôi đã tìm thấy một giải pháp tuyệt vời cho bạn. jni4net là tốt đẹp theo quy định của Jayan nhưng ... –

0

trang web hữu ích cho bạn: http://www.sahirshah.com/java/jni.html

Hãy thử:

public class myJNI { 

/** 
* @param args the command line arguments 
*/ 
public static native String getValue(String key);  
static 
{ 
    System.loadLibrary("CyberoamWinHelper"); 
} 
public static void main(String[] args) { 
    // TODO code application logic here 

    try 
    {  
     String myKey = "abc"; 
     System.out.println(getValue(myKey)); 
    } 
    catch(UnsatisfiedLinkError e) 
    { 
     System.out.println("Ex" + e.getMessage()); 
    } 
    } 
} 

Bạn cần phải quấn dll trong C++ dll như mô tả trong liên kết ở trên. Chỉ cần tạo một tệp tiêu đề với lệnh "javah -jni myJNI" và tạo một tệp C++ dll với chữ ký hàm được tìm thấy trong tệp tiêu đề đó.

Có một cái nhìn tại địa chỉ: http://www.codeproject.com/KB/cross-platform/javacsharp.aspx cho một cụ thể "hello world" ví dụ trong C#

Các vấn đề liên quan