Welcome 微信登录
编程资源 图片资源库 蚂蚁家优选 PDF转换器

首页 / 操作系统 / Linux / 初探JNI技术,HelloWorld 图文详细教程

1、什么是JNI?一种让Java调用其他语言的技术。本博文将会介绍JNI 调用C++的技术。有关于此教程的所有代码下载。------------------------------------------分割线------------------------------------------免费下载地址在 http://linux.linuxidc.com/用户名与密码都是www.linuxidc.com具体下载目录在 /2014年资料/10月/9日/Ubuntu仿Mac主题:SnowBird下载方法见 http://www.linuxidc.com/Linux/2013-07/87684.htm------------------------------------------分割线------------------------------------------2、JNI 之 HelloWorld in JAVAHelloWorld.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:pubworkspaceJNIHelloWorldsrccomhello 的目录2014-05-14  18:04    <DIR>          .
2014-05-14  18:04    <DIR>          ..
2014-05-14  18:04              218 HelloWorld.java
2014-05-14  18:04              207 TestHelloWorld.java在com.hello下有上面提到的两个java文件。(请注意,之前已经编译过java文件,所以bin文件夹下有类文件!)请注意我生成头文件的目录和命令:D:pubworkspaceJNIHelloWorldin>javah com.hello.HelloWorldD:pubworkspaceJNIHelloWorldin>dir
2014-05-14  18:21    <DIR>          .
2014-05-14  18:21    <DIR>          ..
2014-05-14  18:04    <DIR>          com
2014-05-14  18:21              475 com_hello_HelloWorld.h看到没有,生成了一个头文件:com_hello_HelloWorld.h。如果目录不对,很可能报错如下:错误:无法访问 HelloWorld
错误的类文件: D:pubworkspaceJNIHelloWorldincomhelloHelloWorld.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.<init>(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:pubworkspaceJNIHelloWorld所以该dll的路径是:

5.5、步骤5

配置jni头文件,不然C++会报错找不到该头文件:就是到jdk的安装目录下include下把以下相应的文件,复制到vc目录下的include文件夹下:jdkincludejni.h
jdkincludewin32jawt_md.h
jdkincludewin32jni_md.h上面主是jdk安装目录下的三个文件,分别复制它们到vc目录下的include文件夹下。如我的安装位置是:D:Program FilesMicrosoft Visual StudioVC98Include你们可以根据自己的安装位置自行确定。

5.6、步骤6 

代码如下:com_hello_HelloWorld.h:/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* 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
#endifJNIHelloWorld.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++! ");
 return;
}

6、效果如下: 

可以看到,我们在Java中,调用C++的方法成功!至此,一个完整的HelloWorld版本的JNI过程,就完成了。Tiny6410内核模块编译之HelloWorld  http://www.linuxidc.com/Linux/2013-12/93634.htmHelloWorld之Hibernate版 http://www.linuxidc.com/Linux/2014-04/99294.htm在Ubuntu上编写Qt HelloWorld程序 http://www.linuxidc.com/Linux/2014-06/103671.htmTiny6410内核模块编译之HelloWorld http://www.linuxidc.com/Linux/2013-12/93634.htm用Pthreads进行共享内存编程----HelloWorld http://www.linuxidc.com/Linux/2013-04/83103.htmHadoop实例之HelloWorld http://www.linuxidc.com/Linux/2012-12/75406.htmQt Creator for PlayBook上的HelloWorld (Windows版) http://www.linuxidc.com/Linux/2012-05/60653.htmTiny6410 简单的交叉编译helloworld      http://www.linuxidc.com/Linux/2012-03/56732.htm本文永久更新链接地址:http://www.linuxidc.com/Linux/2014-11/109160.htm