JNI是Java native interface的簡寫,可以譯作Java原生接口。Java可以通過JNI調用C/C++的庫,這對于那些對性能要求比較高的Java程序無疑是一個福音。
下面我就用JNI實現一個經典的“Hello World”程序。該程序在Java中通過JNI調用c函數實現“Hello World”的輸出。創建該程序分為以下步驟:
1、創建一個Java程序(HelloWorld.java)定義原生的c/c++函數。
接口文檔示例?2、用javac編譯HelloWorld.java生成HelloWorld.class。
3、用javah帶-jni參數編譯HelloWorld.class生成HelloWorld.h文件,該文件中定義了c的函數原型。在實現c函數的時候需要。
4、創建HelloWorld.c,實現HelloWorld.h定義的函數。
5、編譯HelloWorld.c生成libHelloWorld.so。
jni編程?6、在java虛擬機運行java程序HelloWorld。
下面我們就一步一步來實現這個程序。
1、創建HelloWorld.java
class HelloWorld
{
private native void print();
public static void main(String[] args)
{
new HelloWorld().print();
}
怎么寫接口給別人調用。static
{
System.loadLibrary(“HelloWorld”);
}
}
注意print方法的聲明,關鍵字native表明該方法是一個原生代碼實現的。另外注意static代碼段的System.loadLibrary調用,這段代碼表示在程序加載的時候,自動加載libHelloWorld.so庫。
2、編譯HelloWorld.java
在命令行(帶java環境的linux系統,如ubuntu)中運行如下命令:
javac HelloWorld.java
在當前文件夾編譯生成HelloWorld.class。
JAVA接口例子?3、生成HelloWorld.h
在命令行中運行如下命令:
javah -jni HelloWorld
在當前文件夾中會生成HelloWorld.h。
打開HelloWorld.h將會發現如下代碼:
g代碼程序簡單示例?/* 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
/*
#ifdef __cplusplus
}
#endif
#endif
該文件中包含了一個函數Java_HelloWorld_print的聲明。這里面包含兩個參數,非常重要,后面講實現的時候會講到。
jlink接口定義?4、實現HelloWorld.c
創建HelloWorld.c文件輸入如下的代碼:
#include <jni.h>
#include <stdio.h>
#include “HelloWorld.h”
JNIEXPORT void JNICALL
Java_HelloWorld_print(JNIEnv *env, jobject obj)
{
printf(“Hello World!\n”);
}
注意必須要包含jni.h頭文件,該文件中定義了JNI用到的各種類型,宏定義等。
另外需要注意Java_HelloWorld_print的兩個參數,本例比較簡單,不需要用到這兩個參數。但是這兩個參數在JNI中非常重要。
env代表java虛擬機環境,Java傳過來的參數和c有很大的不同,需要調用JVM提供的接口來轉換成C類型的,就是通過調用env方法來完成轉換的。
obj代表調用的對象,相當于c++的this。當c函數需要改變調用對象成員變量時,可以通過操作這個對象來完成。
5、編譯生成libHelloWorld. so
在Linux下執行如下命令來完成編譯工作:
cc -I/usr/lib/jvm/java-1.7.0-openjdk-amd64/include/linux/ -I/usr/lib/jvm/java-1.7.0-openjdk-amd64/include/ -fPIC -shared -o libHelloWorld.so HelloWorld.c
在當前目錄生成libHelloWorld .so。注意一定需要包含Java的include目錄(請根據自己系統環境設定),因為Helloworld.c中包含了jni.h。
另外一個值得注意的是在HelloWorld.java中我們LoadLibrary方法加載的是“HelloWorld”,可我們生成的Library卻是libHelloWorld。這是Linux的鏈接規定的,一個庫的名字必須要是:lib+庫名+ .so。鏈接的時候只需要提供庫名就可以了。
6、運行Java程序HelloWorld
在Linux下執行如下命令來:
java HelloWorld
如果你這步發生問題,如果這步你收到java.lang.UnsatisfiedLinkError異常,可以通過如下方式指明共享庫的路徑:
java -Djava.library.path=’.’ HelloWorld
這樣就可以看到“Hello world!”輸出了。
版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。
工作时间:8:00-18:00
客服电话
电子邮件
admin@qq.com
扫码二维码
获取最新动态