linux java jni 教程_初探JNI技术,HelloWorld 图文详细教程

1、什么是JNI?

一种让Java调用其他语言的技术。

本博文将会介绍JNI 调用C++的技术。

有关于此教程的所有代码下载。

------------------------------------------分割线------------------------------------------

具体下载目录在 /2014年资料/10月/9日/Ubuntu仿Mac主题:SnowBird

------------------------------------------分割线------------------------------------------

2、JNI 之 HelloWorld in JAVA

HelloWorld.java:

package com.hello;

public class HelloWorld {

public native void hello(String name);

public HelloWorld(){

}

static {

System.loadLibrary( "HelloWorld" );

}

}

注意下,如果我们用JNI编出的文件叫: HelloWorld.dll ,那么System.loadLibrary("HelloWorld"),不用加“.dll”。

TestHelloWorld.java:

package com.hello;

public class TestHelloWorld {

public static void main(String[] args) {

HelloWorld helloWorld = new HelloWorld();

helloWorld.hello("emaster");

}

}

编译一下,生成两个class文件。

至此,java方面的代码就完事了。

3、JNI 之 HelloWorld in C++ 选择IDE

在开始之前,我推荐大家用VC++6.0,而不是CodeBlocks来编写C++方面的代码!

理由如下:

这是CodeBlocks生成的DLL的导出函数:

_Z44Java_com_regMonitor_RegMonitor_jniRegMonitorP7JNIEnv_P8_jobject@8

这是VC生成的DLL的导出函数:

发现没有?CB生成的DLL导出函数多了一些:_Z44啊,P7JNIEnv_P8_jobject之类的。

导出函数多一些东西之后,会导致我们在Java中找不到对应的函数。

哎,也可能是我 CB没有调整好编译命令吧。总之我在VC下成功了。

Ps:

DLL查看导出函数器下载见本文上面的Linux公社资源下载。

4、javah生成C++用的头文件

我的工作目录如下:

D:\pub\workspace\JNIHelloWorld\src\com\hello 的目录

2014-05-14  18:04   

2014-05-14  18:04   

2014-05-14  18:04              218 HelloWorld.java

2014-05-14  18:04              207 TestHelloWorld.java

在com.hello下有上面提到的两个java文件。(请注意,之前已经编译过java文件,所以bin文件夹下有类文件!)

请注意我生成头文件的目录和命令:

D:\pub\workspace\JNIHelloWorld\bin>javah com.hello.HelloWorld

D:\pub\workspace\JNIHelloWorld\bin>dir

2014-05-14  18:21   

2014-05-14  18:21   

2014-05-14  18:04   

2014-05-14  18:21              475 com_hello_HelloWorld.h

看到没有,生成了一个头文件:com_hello_HelloWorld.h。

如果目录不对,很可能报错如下:

错误:无法访问 HelloWorld

错误的类文件: D:\pub\workspace\JNIHelloWorld\bin\com\hello\HelloWorld.class

类文件包含错误的类: com.hello.HelloWorld

请删除该文件或确保该文件位于正确的类路径子目录中。

com.sun.tools.javac.util.Abort

at com.sun.tools.javac.comp.Check.completionError(Check.java:162)

at com.sun.tools.javadoc.DocEnv.loadClass(DocEnv.java:147)

at com.sun.tools.javadoc.RootDocImpl.(RootDocImpl.java:77)

at com.sun.tools.javadoc.JavadocTool.getRootDocImpl(JavadocTool.java:159

)

at com.sun.tools.javadoc.Start.parseAndExecute(Start.java:330)

at com.sun.tools.javadoc.Start.begin(Start.java:128)

at com.sun.tools.javadoc.Main.execute(Main.java:66)

at com.sun.tools.javah.Main.main(Main.java:147)

javadoc: 错误 - 致命错误

2 错误

5、JNI 之 HelloWorld in C++ 详细步骤

5.1、步骤1

VC新建项目,选择Win32 Dynamic-Link Library项目(生成DLL的),默认即可。

我的项目名字为:JNIHelloWorld。

5.2、步骤2

把第4步的头文件:com_hello_HelloWorld.h 放到VC中。

5.3、步骤3

修改下输出DLL的名字:VC菜单 -> 工程 -> 设置 -> 连接 ->  输出文件名 这一栏,改成:Debug/HelloWorld.dll

这样子就和Java代码中的dll名字一样了,其实可以手动F2修改的,这里设置后就不能每次都去修改了,懒人。

5.4、步骤4

把HelloWorld.dll放到Java项目的根目录下,我这里是根目录是:

D:\pub\workspace\JNIHelloWorld

所以该dll的路径是:

5.5、步骤5

配置jni头文件,不然C++会报错找不到该头文件:

就是到jdk的安装目录下include下把以下相应的文件,复制到vc目录下的include文件夹下:

\jdk\include\jni.h

\jdk\include\win32\jawt_md.h

\jdk\include\win32\jni_md.h

上面主是jdk安装目录下的三个文件,分别复制它们到vc目录下的include文件夹下。如我的安装位置是:

D:\Program Files\Microsoft Visual Studio\VC98\Include

你们可以根据自己的安装位置自行确定。

5.6、步骤6

代码如下:

com_hello_HelloWorld.h:

/* DO NOT EDIT THIS FILE - it is machine generated */

#include

/* Header for class com_hello_HelloWorld */

#ifndef _Included_com_hello_HelloWorld

#define _Included_com_hello_HelloWorld

#ifdef __cplusplus

extern "C" {

#endif

/*

* Class:    com_hello_HelloWorld

* Method:    hello

* Signature: (Ljava/lang/String;)V

*/

JNIEXPORT void JNICALL Java_com_hello_HelloWorld_hello

(JNIEnv *, jobject, jstring);

#ifdef __cplusplus

}

#endif

#endif

JNIHelloWorld.cpp:

// JNIHelloWorld.cpp : Defines the entry point for the DLL application.

//

#include "stdafx.h"

#include "com_hello_HelloWorld.h"

BOOL APIENTRY DllMain( HANDLE hModule,

DWORD  ul_reason_for_call,

LPVOID lpReserved

)

{

return TRUE;

}

JNIEXPORT void JNICALL Java_com_hello_HelloWorld_hello

(JNIEnv *, jobject, jstring)

{

printf("I am in C++!\n");

return;

}

6、效果如下:

1f86af8bd2bf55e205c547bfef03586d.png

可以看到,我们在Java中,调用C++的方法成功!

至此,一个完整的HelloWorld版本的JNI过程,就完成了。

0b1331709591d260c1c78e86d0c51c18.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值