日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪(fǎng)問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) >

JNI学习开始篇 基础知识 数据映射及学习资料收集

發(fā)布時(shí)間:2025/7/14 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 JNI学习开始篇 基础知识 数据映射及学习资料收集 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

?

?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)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。