CFSDN nhấn mạnh vào giá trị tạo ra nguồn mở và chúng tôi cam kết xây dựng nền tảng chia sẻ tài nguyên để mọi nhân viên CNTT có thể tìm thấy thế giới tuyệt vời của bạn tại đây.
Bài viết trên blog CFSDN này cung cấp sự hiểu biết toàn diện về vai trò của từ khóa Native trong Java. Nó được tác giả sưu tầm và biên soạn. Nếu bạn quan tâm đến bài viết này thì hãy nhớ like nhé.
Lần đầu tiên tôi gặp bản địa là một phương thức hashCode trong mã nguồn java.lang.Object:
?
1
|
công cộng
tự nhiên
số nguyên
Mã băm();
|
Tại sao lại có người bản xứ? Đây là nơi tôi muốn học. Vì vậy tôi muốn tóm tắt bản địa.
1. Hiểu rõ về Native, đó là JNI, Java Native Interface.
Ngôn ngữ nào cũng mong được trong sạch. Ví dụ: nếu mọi người đều thích giải quyết một giải pháp nào đó, chỉ cần viết nó bằng ngôn ngữ này. Nền tảng Java có API để người dùng tương tác với mã C gốc, được gọi là Giao diện gốc Java.

2. Sử dụng Java để gọi “Xin chào, JNI” của C.
Chúng ta cần làm theo các bước thuận tiện cho việc tan sở:
1. Tạo một lớp Java chứa một phương thức gốc và một phương thức tải thư viện, LoadLibrary. Mã HelloNative.java như sau:
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
công cộng
lớp học
Xin chàoNative
{
tĩnh
{
Hệ thống.loadLibrary(
"Xin chào bản địa"
);
}
công cộng
tĩnh
tự nhiên
vô hiệu
sayXin chào();
@SuppressCảnh báo
(
"truy cập tĩnh"
)
công cộng
tĩnh
vô hiệu
main(String[] args)
{
mới
Xin chào bản địa().nóiXin chào();
}
}
|
Điều đầu tiên mà mọi người nên chú ý là phương thức gốc, phương thức tải thư viện cũng sẽ hoạt động sau này. Từ khóa gốc cho trình biên dịch (thực ra là JVM) biết rằng phương thức đang được gọi được xác định bên ngoài, ở đây đề cập đến C. Nếu bạn chạy trực tiếp mã này, JVM sẽ cho bạn biết: "Đã xảy ra ngoại lệ Java".
?
1
2
3
4
5
|
Ngoại lệ trong luồng
"chủ yếu"
java.lang.UnsatisfiedLinkError: không có HelloNative trong java.library.path
tại java Lang .
và java.lang.Runtime.loadLibrary0 (Nguồn không xác định)
và java.lang.System.loadLibrary(Không rõ nguồn)
tại HelloNative.(HelloNative.java:
5
)
|
Đây là lúc chương trình sử dụng nó và máy ảo báo rằng nó không biết cách tìm sayHello. Những điều sau đây có thể được viết bằng tay, tự nhiên Mason được sử dụng.
2. Chạy javah để lấy tệp tiêu đề khai báo C .h chứa phương thức.
Đối với HelloNative.java, chỉ cần javac javah, như được hiển thị.

Bạn nhận được tệp HelloNative.h sau:
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
JNIEXPORT
vô hiệu
JNICALL Java_HelloNative_sayHello
(JNIEnv *, jclass);
#ifdef __cplusplus
}
#kết thúc nếu
#kết thúc nếu
|
Tệp jni.h nằm ở /%JAVA_HOME%include.
3. Dựa vào tệp tiêu đề, viết C để thực hiện phương thức cục bộ.
Ở đây chúng ta chỉ thực hiện phương thức sayHello như sau:
?
1
2
3
4
5
6
7
|
#bao gồm
"Xin chào bản gốc.h"
#include
JNIEXPORT
vô hiệu
JNICALL Java_HelloNative_sayHello
{
inf(
"Xin chào, JNI"
);
}
|
4. Tạo thư viện chia sẻ dll, sau đó tải thư viện bằng chương trình Java và gọi nó.
Trên Windows, MinGW GCC chạy như sau.
?
1
|
gcc -m64 -Wl,--add-stdcall-alias -I
"C:\Program Files\Java\jdk1.7.0_71\include"
-TÔI
"C:\Program Files\Java\jdk1.7.0_71\include\include\win32"
-shared -o HelloNative.dll HelloNative.c
|
-m64 chỉ ra rằng thư viện dll được tạo là 64-bit. Sau đó chạy HelloNative:
Cuối cùng, bạn có thể thấy bảng điều khiển in như sau:
3. JNI gọi biểu đồ dòng C.

4. Giới thiệu khác.
Bản địa được sử dụng khi cùng phát triển với C++! Bạn không cần phải tự mình phát triển java! .
Việc sử dụng từ khóa gốc cho biết rằng phương thức này là một hàm gốc, nghĩa là phương thức này được triển khai bằng ngôn ngữ C/C++ và được biên dịch thành một DLL và được gọi bởi java. Việc triển khai các hàm này nằm trong DLL và không có trong mã nguồn JDK, vì vậy bạn sẽ không thể nhìn thấy nó. Chúng cũng khác nhau đối với các nền tảng khác nhau. Đây cũng là cơ chế cơ bản của Java. Trên thực tế, Java gọi các phương thức gốc khác nhau trên các nền tảng khác nhau để đạt được quyền truy cập vào hệ điều hành.
1. Bản địa được sử dụng khi java cộng tác với các ngôn ngữ khác (chẳng hạn như c ++), nghĩa là việc triển khai các hàm sau bản gốc không được viết bằng java.
2. Vì nó không phải là Java nên đừng lo lắng về mã nguồn của nó, haha.
Native có nghĩa là thông báo cho hệ điều hành rằng bạn phải thực hiện chức năng này cho tôi vì tôi muốn sử dụng nó. Do đó, các chức năng của từ khóa gốc được hệ điều hành triển khai và chỉ có thể được gọi bằng java.
Java là ngôn ngữ đa nền tảng, nên cái giá phải trả là phải hy sinh một số quyền kiểm soát lớp bên dưới. Để đạt được quyền kiểm soát lớp bên dưới, Java cần có sự trợ giúp của một số ngôn ngữ khác. tự nhiên.
Java không hoàn hảo. Ngoài việc chậm hơn nhiều so với C++ truyền thống về tốc độ chạy, Java không thể truy cập trực tiếp vào hệ điều hành cơ bản (chẳng hạn như phần cứng hệ thống, v.v.). Vì lý do này, Java sử dụng các phương thức gốc để mở rộng Java. chương trình. Phương thức gốc có thể được so sánh với giao diện giữa chương trình Java và chương trình C. Các bước triển khai của nó là: .
1. Khai báo phương thức Native() trong Java và sau đó biên dịch các tệp .
2. Sử dụng javah để tạo tệp .h;
3. Viết tệp .cpp để triển khai phương thức xuất gốc, cần bao gồm tệp .h được tạo ở bước thứ hai (lưu ý rằng nó cũng chứa tệp jni.h đi kèm với JDK);
4. Biên dịch tệp .cpp ở bước thứ ba thành tệp thư viện liên kết động;
5. Sử dụng phương thức System.loadLibrary() trong Java để tải tệp thư viện liên kết động được tạo ở bước thứ tư. Phương thức gốc() này có thể được truy cập trong Java.
Các tình huống áp dụng phương pháp gốc JAVA.
1. Để sử dụng một tính năng nhất định của nền tảng máy chủ cơ bản, tính năng này không thể truy cập được thông qua API JAVA.
2. Để truy cập hệ thống cũ hoặc sử dụng thư viện hiện có và hệ thống này hoặc thư viện này không được viết bằng JAVA.
3. Để tăng tốc hiệu suất của chương trình, hãy triển khai mã nhạy cảm với thời gian dưới dạng phương thức cục bộ.
Bài viết trên cung cấp những hiểu biết toàn diện về vai trò của từ khóa Native trong Java. Đây là toàn bộ nội dung được editor chia sẻ, hy vọng có thể cho các bạn tham khảo và cũng mong các bạn ủng hộ mình.
Cuối cùng, bài viết này về sự hiểu biết toàn diện về vai trò của từ khóa Native trong Java kết thúc ở đây. Nếu bạn muốn biết thêm về sự hiểu biết toàn diện về vai trò của từ khóa Native trong Java, vui lòng tìm kiếm các bài viết CFSDN hoặc tiếp tục duyệt các bài viết liên quan. Tôi hy vọng tất cả các bạn sẽ ủng hộ blog của tôi trong tương lai! .
Tôi là một lập trình viên xuất sắc, rất giỏi!