Chúng ta biết môi trường Java là một môi trường lập trình bao gồm 2 thứ: máy ảo Java (JVM – Java Virtual Machine) và các thư viện API. Khi dịch thì Java sẽ được dịch sang mã máy có thể chạy được trên JVM.
Một khái niệm khác là môi trường máy chủ, tức là hệ điều hành được cài trên máy tính đó, môi trường này cũng có các API riêng, tập lệnh CPU riêng, ngôn ngữ lập trình riêng (thường là C/C++, Assembly).
Môi trường Java được cài nằm trên môi trường máy chủ, ứng với mỗi hệ điều hành (môi trường máy chủ riêng) mà có một môi trường Java riêng, chẳng hạn trên Windows và Solaris thì môi trường Java này là Java Runtime Environment (JRE).
Vai trò của JNI
Khi một môi trường Java được cài trên một hệ điều hành, sẽ có trường hợp người lập trình muốn sử dụng các thư viện của riêng hệ điều hành đó. Lý do là vì dùng thư viện của riêng hệ điều hành sẽ nhanh hơn, hiệu suất cao hơn.
Ngoài ra đối với hệ điều hành Windows thì số lượng các thư viện do cộng đồng viết ra rất nhiều, và có một số thư viện cực kỳ đồ sộ, việc viết lại các thư viện này bằng ngôn ngữ Java sẽ mất nhiều thời gian hơn so với việc tìm cách sử dụng chúng từ Java.
JNI là một tính năng cực kỳ mạnh mẽ cho phép chúng ta sử dụng code từ các ngôn ngữ khác, JNI có tính chất 2 chiều, tức là code từ các ngôn ngữ khác cũng có thể gọi lại code từ Java nữa.
Nhược điểm của JNI
Chúng ta đã biết rằng Java là một ngôn ngữ viêt một lần-chạy mọi nơi, tức là chỉ cần viết code Java, sau đó biên dịch rồi đem lên một hệ điều hành có cài JVM là có thể chạy bình thường. Tuy nhiên khi chúng ta sử dụng JNI để “hợp tác” với code của hệ điều hành, thì lại không thể đem chương trình đó đi chạy trên máy có hệ điều hành khác được, do đó mất đi tính viết một lần-chạy mọi nơi.
Một điều nữa là Java có tính năng type-safe, tức là bạn khai báo kiểu dữ liệu gì thì chỉ được thao tác với kiểu dữ liệu đó, nhưng các ngôn ngữ hệ điều hành thì có thể không có tính năng type-safe, do đó khi viết code JNI bạn sẽ phải chú ý cẩn thận, chỉ cần khác kiểu dữ liệu cũng có thể crash chương trình.
Khi nào nên sử dụng JNI
Trước khi quyết định sử dụng JNI, bạn nên tìm hiểu xem kỹ càng xem có thư viện nào hỗ trợ yêu cầu của mình không, nếu không còn thì hãy dùng JNI, luôn dùng JNI làm giải pháp cuối cùng.