JNI – Đối tượng – Phần 3


Được đăng vào ngày 27/12/2016 | 0 bình luận
JNI – Đối tượng – Phần 3
Đánh giá bài viết

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()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)






Trả lời


Lưu ý: bọc code trong cặp thẻ [code language="x"][/code] để highlight code.


Ví dụ:


[code language="cpp"]


std::cout << "Hello world";


[/code]



Các ngôn ngữ được hỗ trợ gồm: actionscript3, bash, clojure, coldfusion, cpp, csharp, css, delphi, diff, erlang, fsharp, go, groovy, html, java, javafx, javascript, latex, matlab, objc, perl, php, powershell, python, r, ruby, scala, sql, text, vb, xml.

Thư điện tử của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *