2011-09-30 37 views
10

Tôi đang viết một chương trình bằng Java và tôi muốn tạo một giao diện riêng cho một thư viện được viết bằng C++. Nhưng tôi nhầm lẫn với cách viết một khai báo phương thức gốc cho một hàm tạo.Tạo phương thức gốc java cho hàm tạo

Nói rằng tôi có điều này lớp C++ và xây dựng:

template <class _Tp,class _Val> 
    class Arbitrator 
    { 
    public: 
    Arbitrator(); 
    } 

Làm thế nào tôi sẽ viết một bản tuyên bố phương pháp tự nhiên?

Đây là những gì tôi đang làm cho đến thời điểm này: gói hbot.proxy.bwsal.arbitrator;

public class Arbitrator<Tp, Val> 
{ 
    public native Arbitrator Arbitrator(); 
} 

Đây có phải là cách tôi thực hiện việc này không?

Cảm ơn

+0

Javah nói gì về lớp học của bạn? Nếu nó hoạt động, bạn có thể sử dụng nó. – bmargulies

Trả lời

12

Tạo phương pháp gốc. Ví dụ: private native void init(). Gọi nó từ hàm tạo trong Java. Trong đó thực hiện JNI truy cập C++ lớp khi cần thiết.

Bạn sẽ phải sử dụng chữ ký phương thức được tạo bởi JNI, vì vậy bạn không thể ánh xạ trực tiếp lớp Java lên lớp C++ nếu đó là những gì bạn muốn làm.

+0

đúng, tôi hiểu rằng mã triển khai sẽ phải sử dụng chữ ký phương thức JNI, tôi chỉ tự hỏi liệu đó có phải là khai báo gốc chính xác của hàm tạo hay không, hoặc tốt hơn là bạn gọi và gọi phương thức gốc Java constructor? –

+1

Bạn không thể có hàm tạo ban đầu. Vì vậy, có phương pháp 'init' có lẽ là ảnh đẹp nhất của bạn. Tôi nghĩ đó là một phong cách tốt. –

+0

Bạn sẽ làm gì khi muốn giữ bí mật «Init' trong C++? hoặc khi bạn không thể sửa đổi lớp học? – MasterMastic

0

Để gọi một hàm tạo lớp Java từ mã C++ JNI, bạn cần sử dụng các cấu trúc JNI tại đây. Giả sử bạn đã trôi qua một tham chiếu đến JVM với JNIEnv trong C++ chức năng như thế này:

// Chức năng khai

void Java_com_hunter_mcmillen_Arbitrator (JNIEnv *env, jobject thiz) {

// Tham chiếu đến lớp Java mà có bạn phương pháp

jclass itemClazz = env->FindClass("com/hunter/mcmillen/myjava/myclasses/Arbitrator");

// tham chiếu đến phương thức trong lớp java của bạn

jmethodID constructor = env->GetMethodID(itemClazz, "<init>", "(Ljava/lang/Object;Ljava/lang/Object)V");

}

Và bây giờ bạn thực sự có thể gọi hàm constructor trong C++ mã.

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