jni 調用 例子

JNI允許程序員編寫的本地方法處理的情況下,當一個應用程序不能完全在Java編程語言編寫的,例如當標準Java類庫不支持平臺特定的功能或程序庫。它也用來修改在另一種編程語言編寫的應用程序中的一個現有的應用程序,以訪問爪哇應用程序。許多標準庫的類依賴於JNI的開發者和用戶提供的功能,例如文件I / O和聲音功能。包括性能和平臺敏感的標準庫中的實現,允許所有的應用程序訪問此功能的安全和平臺無關的方式。

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查)




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章