出自:http://wenku.baidu.com/link?url=X_plf2x-5OL9FOhLoGtA6JjfS5ivKKFF7m7fvwdnL0vWxi4Ulr-tZCS1UZ_ml20-sVYWwqXE4qcxAeWS7v-kCi5lpZ3ku9qxaoStoVmMeVShtml
JNI入门教程之HelloWorld篇java
资料引用:http://www.knowsky.com/363050.htmlc++
本文讲述如何使用JNI技术实现HelloWorld,目的是让读者熟悉JNI的机制并编写第一个HelloWorld程序。编程
Java Native Interface(JNI)是Java语言的本地编程接口,是J2SDK的一部分。在java程序中,咱们能够经过JNI实现一些用java工具
语言不便实现的功能。一般有如下几种状况咱们须要使用JNI来实现。url
标准的java类库没有提供你的应用程序所须要的功能,一般这些功能是平台相关的你但愿使用一些已经有的类库或者应用程序,而他们并不是用spa
java语言编写的程序的某些部分对速度要求比较苛刻,你选择用汇编或者c语言来实现并在java语言中调操作系统
用他们在《java核心技术》中,做者提到JNI的时候,建议不到万不得已不要使用JNI技术,一方面它须要你把握更多的知识才能够驾驭,一方面使用了htm
JNI你的程序就会丧失可移植性。在本文咱们跳过JNI的底层机制,读者最好先把它想象为本地代码和java代码的粘合剂。关系以下图所示:教程
下面咱们开始编写HelloWorld程序,因为涉及到要编写c/c++代码所以咱们会在开发中使用Microsoft VC++工具。
编写java代码。
咱们在硬盘上创建一个hello目录做为咱们的工做目录,首先咱们须要编写本身的java代码,在java代码中咱们会声明native方法,代码很是简单。以下所示
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
(假如在其余的操做系统多是其余的形式,好比
hello.so
)
编译
java
代码
javac HelloWorld.java
生成
HelloWorld.class
文件
建立
.h
文件
这一步中咱们要使用
javah
命令生成
.h
文件,这个文件要在后面的
c/c++
代码中用到,咱们
运行
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
编写本地实现代码
在这部分咱们要用
C/C++
语言实现
java
中定义的方法,咱们在
VC++
中新建一个
Project,
然
后建立一个
HelloWorldImp.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;
}
注重咱们这里
include
了
jni.h
和刚才获得的
HelloWorld.h
文件。
所以你要在
VC++
里面设置
好,
jni.h
在
JA
V
A_HOME/include
里面。编译经过后再生成
hello.dll
文件。
运行
java
程序
把
上
面
生
成
的
hello.dll
文
件
复
制
到
我
们
的
工
做
目
录
,
这
时
候
我
们
的
目
录
中
包
括
HelloWorld.java
,
HelloWorld.class
和
hello.dll
文件。运行
java HelloWorld
命令,则可在控制
台看到
Hello world
的输出了。
-
资料引用
:http://www.knowsky.com/363050.html
Java: JNI
彻底手册时间
:2007-02-10 00:00:00
来源
:
做者
:
最近在公司里作了一个手机的项目,
须要
JA
V
A
程序在发送短信的时候和第三方的短信服务
器链接。
短信接口是用
C++
写的。
琢磨了三天,
大体搞懂了
JNI
的主体部分。
先将心得整理,
但愿各位朋友少走弯路。
首先引用一篇文章,介绍一个简单的
JNI
的调用的过程。
JA
V
A
以其跨平台的特性深受人们喜好,而又正因为它的跨平台的目的,使得它和本地机器
的各类内部联系变得不多,约束了它的功能。解决
JA
V
A
对本地操做的一种方法就是
JNI
。
JA
V
A
经过
JNI
调用本地方法,
而本地方法是以库文件的形式存放的
(在
WINDOWS
平台上
是
DLL
文件形式,在
UNIX
机器上是
SO
文件形式)
。经过调用本地的库文件的内部方法,
使
JA
V
A
能够实现和本地机器的紧密联系,调用系统级的各接口方法。
简单介绍及应用以下:
1、
JA
V
A
中所须要作的工做
在
JA
V
A
程序中,首先须要在类中声明所调用的库名称,以下:
static {
System.loadLibrary(“goodluck”);
}
在这里,库的扩展名字能够不用写出来,到底是
DLL
仍是
SO
,由系统本身判断。
还需对将要调用的方法作本地声明,关键字为
native
。且只须要声明,而不须要具体实现。
以下:
public native static void set(int i);
public native static int get();
而后编译该
JA
V
A
程序文件,生成
CLASS
,再用
JA
V
AH
命令,
JNI
就会生成
C/C++
的头文
件。
例如程序
testdll.java
,内容为:
public class testdll
{
static
{
System.loadLibrary(\"goodluck\");
}
public native static int get();
public native static void set(int i);
public static void main(String[] args)
{
testdll test = new testdll();
test.set(10);
System.out.println(test.get());
}
}
用
javac testdll.java
编译它,会生成
testdll.class
。
再用
javah testdll
,
则会在当前目录下生成
testdll.h
文件,
这个文件须要被
C/C++
程序调用来
生成所需的库文件。
2、
C/C++
中所须要作的工做
对于已生成的
.h
头文件,
C/C++
所须要作的,就是把它的各个方法具体的实现。而后编译连
接成库文件便可。再把库文件拷贝到
JA
V
A
程序的路径下面,就能够用
JA
V
A
调用
C/C++
所
实现的功能了。
接上例子。咱们先看一下
testdll.h
文件的内容:
/* DO NOT EDIT THIS FILE - it is machine generated */
#include
/* Header for class testdll */
#ifndef _Included_testdll
#define _Included_testdll
#ifdef __cplusplus
extern \"C\" {
#endif
/*
* Class: testdll
* Method: get
* Signature: ()I
*/
JNIEXPORT jint JNICALL Java_testdll_get (JNIEnv *, jclass);
/*
* Class: testdll