JNI学习开始篇 基础知识 数据映射及学习资料收集
?
?JNI學(xué)習(xí)開(kāi)始篇 基礎(chǔ)知識(shí) 數(shù)據(jù)映射及學(xué)習(xí)資料收集
?
JNI介紹
JNI(Java Native Interface) ,Java本地接口。
用Java去調(diào)用其他語(yǔ)言編寫(xiě)的程序,比如C或C++。
JNI作為二者連接的橋梁。
Java的跨平臺(tái)本質(zhì)主要是由于JVM不是跨平臺(tái)的,JNI本身也不是跨平臺(tái)的,即JNI是與特定平臺(tái)相關(guān)的。
?
本地方法調(diào)用
native關(guān)鍵字:使用native所修飾的方法為本地方法,該方法只有聲明,沒(méi)有實(shí)現(xiàn),表示該實(shí)現(xiàn)是由C/C++來(lái)提供的。
JNI本質(zhì)上就是Java代碼調(diào)用動(dòng)態(tài)鏈接庫(kù)的過(guò)程。
在Windows上,動(dòng)態(tài)鏈接庫(kù)就是一個(gè)dll文件;在Linux上,動(dòng)態(tài)鏈接庫(kù)是so文件。
如果在Linux上,那么調(diào)用的動(dòng)態(tài)鏈接庫(kù)文件名必須以lib開(kāi)頭。(Windows上無(wú)此限制。)
Java程序例子如下(來(lái)自張龍老師“深入淺出JNI第一講”視頻教程):
Java程序?qū)嵗?#xff1a;
package com.meng.hellojni;public class HelloJNI {static// static代碼塊的執(zhí)行時(shí)機(jī),是在類(lèi)被加載到JVM的時(shí)候 {// 告訴程序去哪里找本地方法的實(shí)現(xiàn)System.loadLibrary("libHello");// 不要加后綴名,因?yàn)榧虞d方式是系統(tǒng)相關(guān)的 }// 使用native關(guān)鍵字,說(shuō)明本方法為本地方法,其實(shí)現(xiàn)由C/C++提供public native void output();public static void main(String[] args){HelloJNI test = new HelloJNI();test.output();// 使用native方法時(shí),認(rèn)定其實(shí)現(xiàn)已經(jīng)提供,當(dāng)做一個(gè)普通的Java方法,直接使用就可以 }}?
本地代碼
現(xiàn)在要寫(xiě)本地的實(shí)現(xiàn)。
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?
也就是說(shuō),這個(gè)工具會(huì)根據(jù)Java代碼中的native聲明,生成對(duì)應(yīng)需要的頭文件聲明。
其中函數(shù)聲明固定以Java開(kāi)頭,后面跟的是包名+類(lèi)名+方法名,均以下劃線(xiàn)分隔。
另外會(huì)加入兩個(gè)參數(shù),第一個(gè)為JNIEnv *,第二個(gè)為jobject。
在實(shí)現(xiàn)文件中,將頭文件的函數(shù)聲明拷過(guò)去,然后加上實(shí)現(xiàn)代碼即可。
可以利用Visual Studio生成dll文件(需要include剛才生成的頭文件和jni頭文件(jni.h和jni_md.h)),然后把生成的dll文件放在Java程序找得到的路徑下,注意程序中庫(kù)和dll文件名字的對(duì)應(yīng),運(yùn)行Java程序就可以調(diào)用。(本文這部分代碼沒(méi)有給出,有興趣請(qǐng)自己實(shí)現(xiàn))。
?
JNI數(shù)據(jù)映射
? ? ? ? ? ? ? ? ? ? ? ?
截圖自電子書(shū)《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基礎(chǔ)之理解JNI原理
轉(zhuǎn)載于:https://www.cnblogs.com/mengdd/archive/2013/05/07/3064413.html
《新程序員》:云原生和全面數(shù)字化實(shí)踐50位技術(shù)專(zhuān)家共同創(chuàng)作,文字、視頻、音頻交互閱讀總結(jié)
以上是生活随笔為你收集整理的JNI学习开始篇 基础知识 数据映射及学习资料收集的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Java Daemon线程
- 下一篇: (转)彻底学通string.Format