java基礎之理解JNI原理

2021-03-02 java版web項目

JNI是JAVA標準平臺中的一個重要功能,它彌補了JAVA的與平臺無關這一重大優點的不足,在JAVA實現跨平臺的同時,也能與其它語言(如C、C++)的動態庫進行交互,給其它語言發揮優勢的機會。

有了JAVA標準平臺的支持,使JNI模式更加易於實現和使用。在此總結了下面這個知識圖:

實例:

環境說明:ubuntu 10.4.2 LTS系統

程序清單1:src/com/magc/jni/HelloWorld.java

/**

 * 

 */

 package com.magc.jni;

 /**

 * @author magc

 *

 */

 public class HelloWorld {

    

    static {

        

        System.loadLibrary("Hello");

        

    }

    public     native void DisplayHello();

    /**

     * @param args

     */

    public static void main(String[] args) {

        new HelloWorld().DisplayHello();

    }

}

進入src目錄下,編譯該JAVA類,

命令:javac ./com/magc/jni/HelloWorld.java

在該HelloWorld.java所在目錄下生成HelloWorld.class

然後使用javah生成頭文件,

命令:javah -jni com.magc.jni.HelloWorld

在當前目錄下生成com_magc_jni_HelloWorld.h頭文件,此文件供C、C++程序來引用並實現其中的函數

程序清單2:com_magc_jni_HelloWorld.h

/* DO NOT EDIT THIS FILE - it is machine generated */

#include <jni.h>

 /* Header for class com_magc_jni_HelloWorld */

#ifndef _Included_com_magc_jni_HelloWorld

#define _Included_com_magc_jni_HelloWorld

#ifdef __cplusplus

extern "C" {

#endif

/*

 * Class:     com_magc_jni_HelloWorld

 * Method:    DisplayHello

 * Signature: ()V

 */

JNIEXPORT void JNICALL Java_com_magc_jni_HelloWorld_DisplayHello

  (JNIEnv *, jobject);

#ifdef __cplusplus

}

#endif

#endif

註:1)、此頭文件是不需要用戶編譯的,直接供其它C、C++程序引用。

     2)、此頭文件中的Java_com_magc_jni_HelloWorld_DisplayHello(JNIEnv *, jobject)方法,是將來與動態連結庫交互的接口,並需要名字保持一致。

 程序清單3:src/jni_helloworldImpl.cpp

#include <jni.h>

#include "com_magc_jni_HelloWorld.h"

#include <stdio.h>

JNIEXPORT void JNICALL Java_com_magc_jni_HelloWorld_DisplayHello

(JNIEnv *env, jobject obj)

{

    printf("From jni_helloworldImpl.cpp :");

    printf("Hello world ! \n");

    return;

}

此C++文件實現了上述頭文件中的函數,注意方法函數名要保持一致。

編譯生成動態庫libHello.so,

命令:g++ -shared -I /usr/lib/jvm/java-6-openjdk/include jni_helloworldImpl.cpp -o libHello.so

成功後,便會在當前目錄下生成動態連結庫libHello.so文件。

有了具體實現的動態庫後,就可以運行JAVA調用JNI程序類的native方法了,

命令:java -Djava.library.path=. com.magc.jni.HelloWorld

輸入結果即為:From jni_helloworldImpl.cpp :Hello world ! 

本文參考部分內容參考:

http://www.iteye.com/topic/304594#814127

➤➤➤如果您對技術和資源感興趣歡迎加入java開發者交流群【點擊加入】

相關焦點

  • JNI-Thread中start方法調用與run方法回調分析
    因此這就像是jvm為我們提供了一個可以作業系統底層方法的接口,即JNI,java本地接口。在深入查看start0()方法之前,我們先實現一個自己的JNI方法,這樣才能更好地理解start0()方法是如何調用到系統層面的native方法。
  • Java通過-jni調用c語言
    public static void main(String[] args) {             TestJNI test=new TestJNI();             test.set(1);             System.out.println(test.get());                  }}      (2)用javac編譯TestJNI.java
  • JNI基本數據類型
    Hello.javapackage myjni;public class Hello { static { System.loadLibrary("hello"); } public native short addShort(short a, short b);
  • JVM 解剖公園:JNI 臨界區與 GC Locker
    [5]:https://shipilev.net/jvm/anatomy-quarks/9-jni-critical-gclocker/critical.zip1.Parallel 或 CMS先用 Parallel,執行結果如下:```$ make run-paralleljava -Djava.library.path=.
  • Android JNI中的異常處理 與Log日誌使用2步驟
    而在jni 中使用日誌就只需要2步驟。步驟一:引入頭文件 ,include log.h步驟二 定義宏。結果:JNI異常處理異常處理是java 程序設計中的重要功能,java 中 拋出一個異常,虛擬機停止執行代碼並且調用棧反向檢查能處理特定的異常類型處理程序代碼塊,叫做捕獲異常。
  • HOOK工具原理系列之Xposed
    原創文章,轉載請標明出處https://www.cnblogs.com/boycelee/p/13418371.htmlHOOK工具原理系列之Xposed安卓系統啟動什麼zygote?安卓應用運行?#initXposedBridgelibxposed_art.cpp#onVmCreatedde.robv.android.xposed.XposedBridge#main例子Hook原理分析XposedBridge#findAndHookMethodXposedBridge#hookMethodlibxposed.cpp#hookMethodNativeEnableXposedHookartQuickProxyInvokeHandlerInvokeXposedHandleHookedMethodInvokeXposedHandleHookedMethodXposed.java
  • JNI 探秘 — FileInputStream 的 read 方法詳解
    (點擊上方公眾號,可快速關注)來源:左瀟龍 ,www.cnblogs.com/zuoxiaolong/p/jni2.
  • 使用Frida列印Java類函數調用關係
    通過對Android源碼進行閱讀,可以很快發現ART下類函數的四種調用:java調用java,java調用jni,jni調用java,jni調用jni;而java函數又有兩種運行模式:interpreter模式和quick模式。ART對不用的調用過程有著不同的處理邏輯。
  • 給Java新手的一些建議——Java知識點歸納(Java基礎部分)
    JVM相關(包括了各個版本的特性)對於剛剛接觸Java的人來說,JVM相關的知識不一定需要理解很深,對此裡面的概念有一些簡單的了解即可。不過對於一個有著3年以上Java經驗的資深開發者來說,不會JVM幾乎是不可接受的。JVM作為java運行的基礎,很難相信對於JVM一點都不了解的人可以把java語言吃得很透。
  • 迅為開發板安卓JNI開發實戰教程使用編譯好的 so 庫
    我們打開 AS,然後新建一個項目,選擇一個空的 Activity,如下圖所示:這裡我要注意一下,我們的包名要和我們調用的 jni 庫的包名一樣,否則會出問題,之前我們在寫 jni 的時候,我們的包名如下圖所示:包名:那麼我們在新建工程的時候包名也要是這個
  • 音視頻開發之旅(17) JNI與NDK的學習和使用
    Java和Native交互流程通過AS創建Native CPP簡單的項目JNI基礎知識介紹實現JAVA和Native的相互調用資料收穫一、什麼是JNI、NDK?我們先看下了解下java的屬性和方法在JNI 籤名對應關係,然後通過通過native修改java成員值以及調用java方法為例對其進行了解熟悉。其中要特別注意的是:類描述符開頭的'L'與結尾的';'必須要有數組描述符,開頭的'['必須有.
  • Java面試總結之Java基礎
    無論是工作多年的高級開發人員還是剛入職場的新人,在換工作面試的過程中,Java基礎是必不可少的面試題之一。能不能順利通過面試,拿到自己理想的offer,在準備面試的過程中,Java基礎也是很關鍵的。對於工作多年的開發人員來說,Java基礎往往是會被大家所忽略的,但在面試的過程中,確是必不可少的問題。在這篇文章裡就來為大家總結一下經常會被問到的Java基礎題。
  • Andorid APK反逆向解決方案:梆梆加固原理探尋
    平時jni產生的函數名應該為這樣格式:Java_com_secapk_wrapper_ACall_{函數名}。jni方法註冊方式有兩種:通過javah產生函數頭,該種方式產生的方法具有固定的格式。該方式使逆向分析人員比較容易獲取java層native方法對應的本地方法。在JNI_OnLoad方法中手動註冊jni方法,不易查找對應關係。
  • Java之FileFilter過濾器的使用與及原理的簡單介紹
    「創作開運禮」Java之使用遞歸進行文件搜索,這次小編要介紹的是過濾器,我們可以使用過濾器來遍歷文件夾以及裡面的子文件夾還有相對應的文件1.File[] listFiles(FileFilter filter)java.io.FileFilter接口:用於抽象路徑名(File對象)的過濾器。
  • java之小小的基礎知識點
    一.如何編寫java程序呢?1.新建一個java工程2.新建一個包名 新建一個java類 包的命民 :域名的反向 www.百度.com com.百度.www3.編寫內容4.在類中的空白處 右擊運行java 選擇run as java application詳情請參考:
  • Java基礎之反射篇
    Java基礎之反射篇「Hello,大家好!我是老醜。今天給大家帶來的知識點是反射」1. 反射是什麼?反射(Reflection),它允許在運行中的Java程序獲取自身的信息,並且可以操作類或者對象的內部屬性。2. 反射可以做什麼?3.
  • Android JNI 之 Bitmap 操作
    在 Android 通過 JNI 去調用 Bitmap,通過 CMake 去編 so 動態連結庫的話,需要添加 jnigraphics 圖像庫。1target_link_libraries( # Specifies the target library.
  • Java 基礎知識總結(一)之Java 概述
    斷續了文章的更新,今天開始為大家講解Java基礎。希望大家多多支持!寫代碼1,明確需求。我要做什麼?2,分析思路。我要怎麼做?1,2,3。3,確定步驟。每一個思路部分用到哪些語句,方法,和對象。Java Platform Enterprise Edition,開發企業環境下的應用程式,主要針對web 程序開發;JAVASE:Java Platform Standard Edition,完成桌面應用程式的開發,是其它兩者的基礎;JAVAME:Java Platform Micro Edition,開發電子消費產品和嵌入式設備
  • Java 多線程 —— 深入理解 volatile 的原理以及應用
    推薦閱讀:《java 多線程—線程怎麼來的》這一篇主要講解一下volatile的原理以及應用,想必看完這一篇之後,你會對volatile的應用原理以及使用邊界會有更深刻的認知。本篇主要內容:volatile 讀寫同步原理volatile重排序原則volatile應用關鍵字volatile是jvm提供的輕量級的同步機制,但它並不容易理解,而且在多數情況下用不到,被多數開發者拋棄並採用synchronized代替,synchronized屬於重度鎖,如果你對性能有高的要求,那麼同等情況下,變量聲明volatile會減小更少的同步開銷
  • 面試題之java基礎
    應部分網友的建議,從今天起會逐步的總結一些java、php相關的面試題,由簡單到複雜歸納一個系列:【金三銀四】,中間部分題目的答案來源於網絡,如若不嚴謹還望諒解。java基礎面試題 1、簡述Java程序編譯和運行的過程:答:①  Java編譯程序將Java源程序翻譯為JVM可執行代碼--字節碼,創建完源文件之後,程序會先被編譯成 「.class」 文件。