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




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