JNI框架讓本地方法使用Java對象,Java代碼中使用這些對象相同的方式。本地方法可以創建對象,然後檢查和使用這些對象來執行它的任務。本地方法也可以檢查和使用由爪哇應用程序代碼創建的對象。
JNI是有時被稱爲“逃生艙”爲Java開發者因爲它使他們對Java應用程序,Java標準API無法提供添加功能。它可以用來與其他語言編寫的代碼進行接口,如。它也可以用於實時計算或操作,喜歡解決複雜的數學方程,因爲問題的本地代碼有些課程可能比Java虛擬機代碼運行得更快
Examples
HelloWorld
make.sh
#!/bin/sh
# Linux 2.6.32-358.el6.x86_64
# gcc 4.4.7
# openjdk 1.7.0
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:.
javac HelloWorld.java
javah HelloWorld
gcc -shared -fPIC libHelloWorld.c -o libHelloWorld.so
java HelloWorld
build.bat
:: Microsoft Visual Studio 2012 Visual C++ compiler
SET VC="C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC"
:: Microsoft Windows SDK for Windows 7 and .NET Framework 4
SET MSDK="C:\Program Files (x86)\Microsoft SDKs\Windows\v7.1A"
:: Java 1.7.0 update 21
SET JAVA_HOME="C:\Program Files (x86)\Java\jdk1.7.0_21"
:: Add compiler tools folder to the PATH variable. Do not run this too many times or the PATH will exceed the maximum limit.
call %VC%\vcvarsall.bat
javac HelloWorld.java
javah HelloWorld
:: On Windows, the JNI library should not have a "lib" prefix
%VC%\bin\cl /I%JAVA_HOME%\include /I%JAVA_HOME%\include\win32 /I%VC%\include /I%VC%\lib /I%MSDK%\Lib libHelloWorld.c /FeHelloWorld.dll /LD
java HelloWorld
HelloWorld.java
class HelloWorld
{
private native void print();
public static void main(String[] args)
{
new HelloWorld().print();
}
static{
System.loadLibrary("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: print
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_HelloWorld_print
(JNIEnv *, jobject);
#ifdef __cplusplus
}
#endif
#endif
libHelloWorld.c
#include <stdio.h>
#include "HelloWorld.h"
JNIEXPORT void JNICALL
Java_HelloWorld_print(JNIEnv *env, jobject obj)
{
printf("Hello World!\n");
return;
}
Invocation:
$ chmod +x make.sh
$ ./make.sh
參考網址:
https://en.wikipedia.org/wiki/Java_Native_Interface
最後補充其mak 文件的改動
#!/bin/sh
# Linux 2.6.32-358.el6.x86_64
# gcc 4.4.7
# openjdk 1.7.0
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:.
javac HelloWorld.java
javah HelloWorld
gcc -shared -fPIC libHelloWorld.c -I ./ -I /usr/java/jdk1.7.0_67/include/ -I /usr/java/jdk1.7.0_67/include/linux -o libHelloWorld.so
java HelloWorld
(注意:這裏的-I是導入頭文件的搜索路徑,這裏主要是爲搜索TestJNI.h中的jni.h。不同的系統路徑可能不同,可通過locate jni.h查)