Java的JNI


 目錄

 

1. JNI

1.1. JNI技術的使用場景

Java Native InterfaceJNIJava本地接口)是Java語言的本地編程接口java程序中,我們可以通過JNI實現一些用java語言不便實現的功能如下

1標准的java類庫沒有提供你的應用程序所需要的功能,通常這些功能是平台相關的(只能由其他語言編寫)

2你希望使用一些已經有的類庫或者應用程序,而他們並非用java語言編寫的

3程序的某些部分對速度要求比較苛刻,你選擇用匯編或者c語言來實現並在java語言中調用他們

4為了應用的安全性,會將一些復雜的邏輯和算法通過本地代碼(CC++)來實現本地代碼比字節碼難以破解

 

建議不到萬不得已不要使用JNI技術,一方面它需要你掌握更多的知識才可以駕馭,一方面使用了JNI你的程序就會喪失可移植性C/C++是非跨平台的)

1.2. 使用JNI實現HelloWorld

http://blog.csdn.net/xyang81/article/details/41777471

1編寫java代碼

我們在硬盤上建立一個hello目錄作為我們的工作目錄,首先我們需要編寫自己的java代碼,在java代碼中我們會聲明native方法,代碼非常簡單(稱為JNI程序它實現的JNI規范,是JVM規范的一部分,所以可以運行於JVM。如下所示

class HelloWorld
{
    public native void displayHelloWorld();
    static {
        System.loadLibrary("hello");
    }
   
    public static void main(String[] args) {
        new HelloWorld().displayHelloWorld();
    }
}
注意我們的displayHelloWorld()方法的聲明,它有一個關鍵字native,表明這個方法使用java以外的語言實現。方法不包括實現,因為我們要用c/c++語言實現它。注意System.loadLibrary("hello")這句代碼,它是在靜態初始化塊中定義的,系統用來裝載hello庫,這就是我們在后面生成的hello.dll 

 

System.loadLibrary("HelloWorld");  

只需要指定動態庫的名字即可,不需要加lib前綴,也不要加.so.dll.jnilib后綴java會去java.library.path系統屬性指定的目錄下查找動態庫文件,如果沒有找到會拋出java.lang.UnsatisfiedLinkError異常

System.load("/Users/yangxin/Desktop/libHelloWorld.jnilib");  

指定動態庫的絕對路徑名,需要加上前綴和后綴

 

2)創建.h文件
javac HelloWorld.java生成HelloWorld.class文件
javah HelloWorld。這樣我們可以看到在相同目錄下生成了一個HelloWorld.h文件,文件內容如下 
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class HelloWorld */
#ifndef _Included_HelloWorld
#define _Included_HelloWorld
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     HelloWorld
 * Method:    displayHelloWorld
 * Signature: ()V
 */
JNIEXPORT void JNICALL Java_HelloWorld_displayHelloWorld
  (JNIEnv *, jobject);
#ifdef __cplusplus
}
#endif
#endif

 

3)編寫本地實現代碼
在這部分我們要用C/C++語言實現java中定義的方法,我們在VC++中新建一個Project,然后創建一個HelloWorldImpl.cpp文件,內容如下
#include <jni.h>
#include "HelloWorld.h"
#include <stdio.h>

JNIEXPORT void JNICALL
Java_HelloWorld_displayHelloWorld(JNIEnv *env, jobject obj)
{
    printf("Hello world!/n");
    return;
}
注意我們這里includejni.h和剛才得到的HelloWorld.h文件。因此你要在VC++里面設置好,jni.hJAVA_HOME/include里面。編譯通過后再生成hello.dll文件

 

4運行java程序
把上面生成的hello.dll文件復制到我們的工作目錄,這時候我們的目錄中包括HelloWorld.javaHelloWorld.classhello.dll文件。運行java HelloWorld命令,則可在控制台看到Hello world!的輸出了

1.3. JNI技術使用總結

JNI開發流程主要分為以下6步:

1、編寫聲明了native方法的Java

2、將Java源代碼編譯成class字節碼文件

3、用javah -jni命令生成.h頭文件(javahjdk自帶的一個命令,-jni參數表示將class中用native聲明的函數生成jni規則的函數)

4、用本地代碼實現.h頭文件中的函數

5、將本地代碼編譯成動態庫(windows*.dlllinux/unix*.somac os x*.jnilib

6、拷貝動態庫至 java.library.path 本地庫搜索目錄下,並運行Java程序

1.4. 參考資料

http://blog.csdn.net/xyang81/article/details/41777471

http://blog.csdn.net/mingjava/article/details/180946


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM