2012-02-01 45 views
5

Tôi có một chức năng Java mà trả về một trường hợp singleton của một ClassJNI cuộc gọi đến chức năng Java trả lại một kết quả Object trong NoSuchMethodError

public static synchronized MyClass getInstance() throws MyClassException{ 
    if (instance == NULL){ 
     // create 
    } 
    return instance; 
} 

Tôi muốn gọi này thông qua C++, nhưng khi tôi làm, nó sẽ trả về một NoSuchMethodError.

cls = jenv->FindClass("MyClass"); 
if (cls == NULL) 
{ 
//error handling 
} 
mid = jenv->GetStaticMethodID(cls, "getInstance", "()LMyClass"); 
if (mid == NULL) 
{ 
//error handling 
} 

Khi tôi chạy:

javap -s -p on MyClass, I get the signature: 
public static synchronized MyClass getInstance() throws MyClassException; 
Signature:()LMyClass; 

Nếu tôi thay đổi chức năng chữ ký để làm mất hiệu lực trong lớp Java, cuộc gọi GetStaticMethodID hoạt động như mong đợi.

Tôi có cần thiết lập công việc để mong đợi giá trị trả lại từ cuộc gọi không?

Điều này có thể thực hiện mà không cần gọi trước GetStaticMethodID không?

+0

Cuộc gọi trả lại lỗi ở đâu? –

+0

Khi tôi chạy ứng dụng C++, tôi nhận được: Ngoại lệ trong chủ đề "chính" java.lang.NoSuchMethodError: getInstance – donalmg

+0

Tôi tự hỏi liệu bạn có cần chỉ định đường dẫn đầy đủ đến "MyClass" trong lệnh gọi GetStaticMethodId hay không. Ví dụ: jenv-> GetStaticMethodID (cls, "getInstance", "() Lcom/work/MyClass;"); Tùy thuộc vào nơi mã CPP sống liên quan đến mã Java? Chỉ là một ý nghĩ. – eternaln00b

Trả lời

1

Tôi tin rằng sự cố là không thể giải quyết đối số đầu ra được chỉ định. Nếu lớp java của bạn có trong gói: "com/work /", bạn sẽ nói:

jenv->GetStaticMethodID(cls, "getInstance", "()Lcom/work/MyClass;"); 

Điều đó nên làm điều đó.

EDIT:

Có vẻ như câu trả lời nằm ở đầu ra của javap phải không? Bạn nên làm:

jenv->GetStaticMethodID(cls, "getInstance", "()LMyClass;"); 
+0

Lỗi chính xác trong câu hỏi ban đầu của tôi. Tôi đã có điều này như **() LMyClass ** – donalmg

+0

Và bạn rõ ràng nói "() LMyClass;" với dấu chấm phẩy ở cuối? – eternaln00b

+0

Ví dụ: tôi có thể làm: getStaticMethodID (cls, "currentThread", "() Ljava/lang/Thread;"); Và điều đó hoạt động tốt. Điều đó có hiệu quả với bạn không? – eternaln00b

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