JNI学习开始篇 基础知识 数据映射及学习资料收集
?
?JNI學習開始篇 基礎知識 數據映射及學習資料收集
?
JNI介紹
JNI(Java Native Interface) ,Java本地接口。
用Java去調用其他語言編寫的程序,比如C或C++。
JNI作為二者連接的橋梁。
Java的跨平臺本質主要是由于JVM不是跨平臺的,JNI本身也不是跨平臺的,即JNI是與特定平臺相關的。
?
本地方法調用
native關鍵字:使用native所修飾的方法為本地方法,該方法只有聲明,沒有實現,表示該實現是由C/C++來提供的。
JNI本質上就是Java代碼調用動態鏈接庫的過程。
在Windows上,動態鏈接庫就是一個dll文件;在Linux上,動態鏈接庫是so文件。
如果在Linux上,那么調用的動態鏈接庫文件名必須以lib開頭。(Windows上無此限制。)
Java程序例子如下(來自張龍老師“深入淺出JNI第一講”視頻教程):
Java程序實例:
package com.meng.hellojni;public class HelloJNI {static// static代碼塊的執行時機,是在類被加載到JVM的時候 {// 告訴程序去哪里找本地方法的實現System.loadLibrary("libHello");// 不要加后綴名,因為加載方式是系統相關的 }// 使用native關鍵字,說明本方法為本地方法,其實現由C/C++提供public native void output();public static void main(String[] args){HelloJNI test = new HelloJNI();test.output();// 使用native方法時,認定其實現已經提供,當做一個普通的Java方法,直接使用就可以 }}?
本地代碼
現在要寫本地的實現。
C++代碼一般由頭文件和源程序文件兩部分組成。
可以利用JDK中的javah工具,由Java代碼生成需要的頭文件。
先javac編譯源文件,生成class文件,然后javah生成頭文件如下:
?
/* DO NOT EDIT THIS FILE - it is machine generated */ #include <jni.h> /* Header for class com_meng_hellojni_HelloJNI */#ifndef _Included_com_meng_hellojni_HelloJNI #define _Included_com_meng_hellojni_HelloJNI #ifdef __cplusplus extern "C" { #endif /** Class: com_meng_hellojni_HelloJNI* Method: output* Signature: ()V*/ JNIEXPORT void JNICALL Java_com_meng_hellojni_HelloJNI_output(JNIEnv *, jobject);#ifdef __cplusplus } #endif #endif?
也就是說,這個工具會根據Java代碼中的native聲明,生成對應需要的頭文件聲明。
其中函數聲明固定以Java開頭,后面跟的是包名+類名+方法名,均以下劃線分隔。
另外會加入兩個參數,第一個為JNIEnv *,第二個為jobject。
在實現文件中,將頭文件的函數聲明拷過去,然后加上實現代碼即可。
可以利用Visual Studio生成dll文件(需要include剛才生成的頭文件和jni頭文件(jni.h和jni_md.h)),然后把生成的dll文件放在Java程序找得到的路徑下,注意程序中庫和dll文件名字的對應,運行Java程序就可以調用。(本文這部分代碼沒有給出,有興趣請自己實現)。
?
JNI數據映射
? ? ? ? ? ? ? ? ? ? ? ?
截圖自電子書《Android NDK Beginner's Guide》 Chapter 3
?
資料收集
? Oracle's JNI page for Java 6, including the JNI Specification
? Best practices for using the Java Native Interface
? JNI Complete tutorial with examples
Android Training: JNI Tips:
? http://developer.android.com/training/articles/perf-jni.html
? JAVA基礎之理解JNI原理
轉載于:https://www.cnblogs.com/mengdd/archive/2013/05/07/3064413.html
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
以上是生活随笔為你收集整理的JNI学习开始篇 基础知识 数据映射及学习资料收集的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java Daemon线程
- 下一篇: (转)彻底学通string.Format