Trong phần này chúng ta sẽ tìm hiểu cách gọi phương thức constructor của Java từ C++.
Gọi constructor
Giả sử chúng ta có lớp Point
trong Java như sau:
class Point { private int x; private int y; public Point(int x, int y) { this.x = x; this.y = y; } public int getX() { return this.x; } public int getY() { return this.y; } public void setX(int x) { this.x = x; } public void setY(int y) { this.y = y; } }
Tiếp theo chúng ta có code main Java như sau:
class Constructor { static { System.loadLibrary("Constructor"); } private native void createConstructor(); public static void main(String[] args) { Constructor c = new Constructor(); c.createConstructor(); } }
Phương thức native là createConstructor()
, chúng ta code phương thức này như sau:
#include "Constructor.h" #include <iostream> JNIEXPORT void JNICALL Java_Constructor_createConstructor(JNIEnv *e, jobject obj) { jclass pointClass = e->FindClass("Point"); jmethodID mid = e->GetMethodID(pointClass, "<init>", "(II)V"); jobject pointObj = e->NewObject(pointClass, mid, 3, 5); jmethodID getX = e->GetMethodID(pointClass, "getX", "()I"); jmethodID getY = e->GetMethodID(pointClass, "getY", "()I"); int x = e->CallIntMethod(pointObj, getX); int y = e->CallIntMethod(pointObj, getY); std::cout << "Your point: (" << x << ", " << y << ")"; }
Ở đây phương thức native sẽ gọi hàm constructor của lớp Point
và truyền vào tham số là 2 giá trị x, y. Sau đó chúng ta in 2 giá trị này ra màn hình.
Các bước làm thì cũng tương tự như cách gọi một phương thức bình thường, đầu tiên chúng ta lấy đối tượng jclass
của lớp Point.
Ở đây chúng ta phải dùng phương thức FindClass()
chứ không dùng phương thức GetObjectClass(),
bởi vì đối tượng jobject
được gửi sang là đối tượng Constructor
chứ không phải Point
.
Tiếp theo chúng ta cũng lấy đối tượng jmethodID,
đối với phương thức constructor thì chúng ta truyền vào tên phương thức là <init>.
Sau đó chúng ta tạo một đối tượng jobject bằng phương thức NewObject()
, phương thức này nhận vào đối tượng jclass, jmethodID
và danh sách các tham số của phương thức đó.
Sau khi đã có đối tượng đó rồi chúng ta lấy jmethodID
của phương thức getX()
và getY()
rồi sử dụng như bình thường, hoặc bạn có thể lưu lại 2 biến x, y trước khi khởi tạo để khỏi mất công lấy các phương thức này ra dùng nữa.
Your point: (3, 5)