Java调用C和C++动态链接库DLL第一步利用JNI

时间:2024.4.30

Java调用C/C++动态链接库DLL第一步利用JNI

1.新建一个项目,创建一个类TestNative.java,然后点击run运行生成.class文件

2.利用jdk自带的工具javah.exe生成这个sayHello()这个native本地方法的头文件

先进入eclipse下工程目录,进入bin目录,然后执行如下代码,编译出头文件

这时候会出现一个自动生成的头文件用于我们编写C/C++代码

3.利用Visual Studio2010 新建一个window控制台项目

?

复制刚才利用javah生成的com_taobao_jni_TestNative.h到C++项目工程目录下,然后右击添加-->现有项将头文件引入到项目环境中

4.添加JDK中系统头文件,如jni.h,这个头文件其实是在jdk目录下的include 目录下

我们需要将jdk所需的所有头文件(包括win32下的所有头文件)复制到visual studio中VC编译工具的include文件夹中,添加引入。【所有头文件必须富之岛include的根目录下】

这时候vs编译器 就不会报错了,接下来我们新建一个NativeCode.cpp文件,复制生成的头文件里面的方法,实现此方法

#include"com_taobao_jni_TestNative.h"

#include <iostream>

using namespace std;

JNIEXPORT void JNICALL Java_com_taobao_jni_TestNative_sayHello (JNIEnv * env, jobject obj)

{

    cout<<"Hello World..."<<endl;

}

编译执行生成对应的dll文件,对与不同位数版本的jdk我们需要生成不同位数的dll,就如我的jdk是64位,那么我就需要编译出64位的dll,默认VS的编译指定是32bit,我们需要添加x64支持。

运行就能在x64/Debug目录下看到生成好的dll文件,如果是32位操作系统的不需要做此操作,默认就是32位的编译器

5.在eclipse环境变量中增加native library location支持,将C++目录下的x64/Debug/dll目录添加

6.执行

package com.taobao.jni;

publicclass TestNative {

    publicnativevoid sayHello();

    publicstaticvoid main(String[] args) {

        System.loadLibrary("JavaNativeCode");       //JavaNativeCode.dll就是在x64目录下编译的DLL文件

        new TestNative().sayHello();

    }

}

7.完成!


第二篇:jni Java使用C库


JAVA使用JNI调用C/C++动态库

在实际使用中,我们经常会在JAVA和C/C++之间进行交互,比较通用的方法目前是使用JNI接口进行。

Native方法:

Java不是完美的,Java的不足除了体现在运行速度上要比传统的C++慢许多之外,Java无法直接访问到操作系统底层(如系统硬件等),为此Java使用native方法来扩展Java程序的功能。

可以将native方法比作Java程序同C程序的接口,其实现步骤:

1、在Java中声明native()方法,然后编译;

2、用javah产生一个.h文件;

3、写一个.cpp文件实现native导出方法,其中需要包含第二步产生的.h文件(注意其中又包含了JDK带的jni.h文件);

4、将第三步的.cpp文件编译成动态链接库文件;

5、在Java中用System.loadLibrary()方法加载第四步产生的动态链接库文件,这个native()方法就可以在Java中被访问了。

JAVA本地方法适用的情况

1.为了使用底层的主机平台的某个特性,而这个特性不能通过JAVA API访问

2.为了访问一个老的系统或者使用一个已有的库,而这个系统或这个库不是用JAVA编写的

3.为了加快程序的性能,而将一段时间敏感的代码作为本地方法实现。 =====================================================

一. 什么是JNI?

JNI是Java Native Interface的缩写。从Java1.1开始,JNI标准成为Java平台的一部分。通过JNI,可以实现Java和其他的语言代码的交互,常用的是Java和C/C++之间的交互。

二. JNI的使用方法

这里以Helloworld.java调用HelloWorld.dll/HelloWorld.so为例,讲述JNI的使用方法。

1. 创建一个class(HelloWorld.java),并声明一个native方法;

2. 使用javac编译该class(HelloWorld.java),生成HelloWorld.class;

3. 使用javah –jni生成C 头文件,其中包含native方法的原型。

4. 使用C/C++实现native方法(HelloWorld.c/ HelloWorld.cpp)。

5. 编译C代码(HelloWorld.c),创建动态库文件(HelloWorld.dll(for Windows)或者HelloWorld.so(for Linux));

6. 使用java类(HelloWorld.java),加载C动态库文件和native方法,实现二者交互。 下图是JNI的使用方法进行图例化解释:

jniJava使用C库

图1 JNI使用方法

三. JNI应用实例

根据“二.JNI的使用方法”中介绍的步骤,我们做几个实例。

1. 简单的实例

1) 创建一个class,名称就用HelloWorld.java,并声明一个native方法; public class HelloWorld {

static {

System.loadLibrary("HelloWorld");

}

private native void setMsg(String str);

private native String getMsg();

public static void main(String[] argv) {

HelloWorld hw = new HelloWorld();

hw.setMsg("HelloWorld");

System.out.println(hw.getMsg());

}

}

2) 执行javac HelloWorld.java命令,生成HelloWorld.class;

3) 执行javah –jni 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: setMsg

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

*/

JNIEXPORT void JNICALL Java_HelloWorld_setMsg

(JNIEnv *, jobject, jstring);

/*

* Class: HelloWorld

* Method: getMsg

* Signature: ()Ljava/lang/String;

*/

JNIEXPORT jstring JNICALL Java_HelloWorld_getMsg

(JNIEnv *, jobject);

#ifdef __cplusplus

}

#endif

#endif

需要注意的是Java中的类型发生了变化,另外native方法前面增加了前缀。

4) 创建HelloWorld.cpp文件,在此我们使用VC++6.0做成HelloWorld.cpp; // HelloWorld.cpp : Defines the entry point for the DLL application. //

#include "stdafx.h"

#include "HelloWorld.h"

char far* str;

JNIEXPORT void JNICALL Java_HelloWorld_setMsg

(JNIEnv *env, jobject obj, jstring jstr) {

str = (char far*)env->GetStringUTFChars(jstr, NULL); }

JNIEXPORT jstring JNICALL Java_HelloWorld_getMsg

(JNIEnv *env, jobject obj) {

jstring jstr;

jstr = env->NewStringUTF(str);

return jstr;

}

5) 编译HelloWorld.cpp,生成HelloWorld.dll;

6) 执行java HelloWorld命令,得到如下结果:

jniJava使用C库

2. 带Package的实例

通常我们使用的source都是在某个Package中,这种情况下的处理稍有不同。还是以上面的示例为例,简单说明一下。

1) 创建一个class,名称就用HelloWorld.java,Package为jp.co.test,并声明一个native

方法;

package jp.co.test;

public class HelloWorld {

static {

System.loadLibrary("HelloWorld");

}

private native void setMsg(String str);

private native String getMsg();

public static void main(String[] argv) {

HelloWorld hw = new HelloWorld();

hw.setMsg("HelloWorld");

System.out.println(hw.getMsg());

}

}

2) 在jp/co/test/目录下使用javac HelloWorld.java命令,编译生成HelloWorld.class

文件;

3) 此步稍有不同的是要在source Folder路径下执行javah jp.co.test.HelloWorld命令,

执行成功后,也会在source Folder路径下生成jp_co_test_HelloWorld.h文件,其内容如下:

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

#include <jni.h>

/* Header for class jp_co_test_HelloWorld */

#ifndef _Included_jp_co_test_HelloWorld

#define _Included_jp_co_test_HelloWorld

#ifdef __cplusplus

extern "C" {

#endif

/*

* Class: jp_co_test_HelloWorld

* Method: setMsg

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

*/

JNIEXPORT void JNICALL Java_jp_co_test_HelloWorld_setMsg

(JNIEnv *, jobject, jstring);

/*

* Class: jp_co_test_HelloWorld

* Method: getMsg

* Signature: ()Ljava/lang/String;

*/

JNIEXPORT jstring JNICALL Java_jp_co_test_HelloWorld_getMsg

(JNIEnv *, jobject);

#ifdef __cplusplus

}

#endif

#endif

4) 创建HelloWorld.cpp文件,native方法名要和jp_co_test_HelloWorld.h中的一致;

5) 编译HelloWorld.cpp,生成HelloWorld.dll;

6) 把HelloWorld.dll copy到source Folder路径下,执行java jp.co.test.HelloWorld

得到如下结果:

jniJava使用C库

四. 结束语

至此,JNI的基本使用方法介绍完了,但在实际使用中可能还会存在各种各样的问题,如其他操作系统(如:Linux)下的使用方法,传递中文字符的问题,传递复杂类型的问题等等,这需要大家不断深入探讨和钻研,方可熟练运用。

更多相关推荐:
java开发简历范本——有经验

个人简历个人信息年龄22姓名XXX性别男联系电话150xxxxxxxx联系邮箱citygulivecn现住址新街口程阁老巷专业计算机网络与电子商务择业目标Java软件工程师基于Oracle数据库MySQL数据库...

java程序员个人简历

java程序员个人简历,内容附图。

java软件工程师简历模板1

个人简历姓名XXX民族汉族性别女现住址湖北武汉英语水平CET4学历本科毕业院校湖北民族学院专业计算机科学与技术政治面貌预备党员手机1398614电子邮件107916qqcomJava软件开发工程师1编程语言熟悉...

java开发简历范本——无经验

个人简历个人概况姓名XXXXXXXXX民族汉性别男专业计算机科学与技术学历本科联系方式XXXXXXXXXX求职意向JAVA软件工程师专业技能熟练掌握CoreJava熟练掌握jdbc的原理以及Hibernate和...

java简历模板一

个人简历个人基本信息姓名出生年月性别籍贯学历政治面貌联系电话Email毕业院校求职意向程序员教育经历20xx年9月20xx年6月黑龙江科技大学20xx年3月20xx年10月oracle培训中心综合技能1擅长J2...

java简历模板

个人简历个人信息姓名XXX性别男年龄22学校XXXXXXXX统本外语水平一般专业通信工程政治面貌团员现居地XXX电话XXXXXXXXXXXX电子邮箱XXX163com求职意向JAVA开发工程师掌握技能1具有良好...

java程序员个人简历模板

找工作就去才智尚招聘网Java程序员的个人简历模板个人基本简历简历编号姓名目前所在地荔湾区户口所在地广州婚姻状况未婚培训认证求职意向及工作经历人才类型应届毕业生应聘职位工作年限0无职职称称一个可到职日期月希望工...

java程序员求职简历

个人简历

java软件开发个人简历模板

熟悉CoreJava熟练掌握基于ServletHtmlStrutsJSP的Web编程能够实现大中型企业商务网站的开发熟悉MVC模式的系统开发与J2EE技术具备J2EE开发工程师能力熟练运用Tomcat中间件熟练...

java工程师简历模版

应聘职位java软件开发工程师应聘职位java软件开发工程师

java 简历

的个人简历个人信息姓名出生日期19xx年01月日户籍地河北省手机邮箱现居住城市北京市IT技能1熟练使用MyEclipseDreamwever等开发工具以及tomcat的安装与使用2熟练使用OracleMysql...

java开发的简历模板

简历姓名XXX性别女学历本科联系方式XXXXXXXXXXXXXEmailXXXXXXXXXXXXXXX目标职位Java开发工程师1熟练掌握javaSE熟悉面向对象编程思想2熟练使用JDBCServletJSP动...

java简历(32篇)