JNI学习笔记--HelloWorld篇

 

出自: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

相关文章
相关标签/搜索