JNI第一个程序

再利用不同的语言来做功能开发的时候,各种不同语言所开的功能模块的融合是一个重要的问题。在Java中提供了一种调用本地方法的机制:JNIJava Native Interface。虽然java不提倡使用本地接口,但是用C/C++开发的代码可以给我们的工作带来非常大的便利。

以下是编写第一个JNI程序的过程以及所遇到的问题:

第一:

创建一个类,里面包含了一个Native的方法。

例如:建立HelloNative.Java文件,内容如下:

public class HelloNative {

public  static native void greet();

}

这里关键字Native说明该方法是一个本地方法。

第二:简历一个测试类来调用该类的本地方法:建立了Test.java如下:

public class Test {

 

/**

 * @param args

 */

public static void main(String[] args) {

HelloNative.greet();

 

}

static 

{

System.loadLibrary("Code");

}

 

}

这里,System.loadLibrary("Code");中的“Code”使我们要创建的库函数,是一个DLL文件(windows环境下)或者so文件(Linux)。

第三:编写本地方法。在本地方法编写的时候要满足Java的规范。虽然在Test.Java中的方法名是greet();但是我们在编写本地方法的时候却不能也按照这种方法来写。那怎么办呢?编译这个类文件,会产生一个头文件,在头文件中会指明这个方法的本地方法名。具体的步骤如下:

先编译HelloNative.java文件得到HelloNative.class文件,在利用javah命令来产生一个头文件HelloNative.h文件。这个头文件里面的内容不要做任何更改。

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

#include <jni.h>

/* Header for class HelloNative */

 

#ifndef _Included_HelloNative

#define _Included_HelloNative

#ifdef __cplusplus

extern "C" {

#endif

/*

 * Class:     HelloNative

 * Method:    greet

 * Signature: ()V

 */

JNIEXPORT void JNICALL Java_HelloNative_greet

  (JNIEnv *, jclass);

 

#ifdef __cplusplus

}

#endif

#endif

 

用到的指令如下:

javac HelloNative.java得到HelloNative.class

javah HelloNative得到HelloNative.h这就是变异号的头文件。

接下来就是库文件的编写了。这里选择的是VS2010来编写库文件。

第四:打开VS2010,选择创建新的项目:Win32 项目。注意不是win32 控制台项目。将输出选择为DLL输出。并将之前所产生的HelloNative.h拷贝到本地的文件夹下面,这样就可以找到该头文件。从头文件中得到函数的方法名:JNIEXPORT void JNICALL Java_HelloNative_greet  (JNIEnv *, jclass)

现在为这方法编写函数体实现。

#include "stdafx.h"

#include "jni.h"

#include"stdio.h"

extern "C"

JNIEXPORT void JNICALL Java_HelloNative_greet  (JNIEnv *, jclass)

{

printf("this is the first JNI test");

}

这个函数体非常简单。但有些地方要注意:

第一:#include "jni.h"要包含这个头文件。

该头文件的位置位于:java/jdk/include

VS 2010 中要将这个头文件包含进来。方法:右键“项目名”,选择属性,弹出属性页,选择配置属性中的VC++目录,在选择右侧的“包含目录”将头文件所在的文件夹包含进来。

第二:由于我们实在C++中编写方法体的,所以要加extern "C",避免实现与c++特定的代码。

完成之后,编译生成dll文件。然后将该Dll文件拷贝到jdk/bin目录下面,这样Eclipse中的代码可以找到。

第三,此时可能汇报如下的错误:Can't load IA 32-bit .dll on a AMD 64-bit platform

这个错误是由于生成的Dll32位所导致的。虽然你用的是64位的机子。解决方法:

将工程的配置改为X64的平台在编译。方法如下:

选择配置管理器,改变活动方法解决平台,选择x64平台。这样就可以产生64dll

运行Eclipse的测试程序,就可以看到输出。

 

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
资源包主要包含以下内容: ASP项目源码:每个资源包中都包含完整的ASP项目源码,这些源码采用了经典的ASP技术开发,结构清晰、注释详细,帮助用户轻松理解整个项目的逻辑和实现方式。通过这些源码,用户可以学习到ASP的基本语法、服务器端脚本编写方法、数据库操作、用户权限管理等关键技术。 数据库设计文件:为了方便用户更好地理解系统的后台逻辑,每个项目中都附带了完整的数据库设计文件。这些文件通常包括数据库结构图、数据表设计文档,以及示例数据SQL脚本。用户可以通过这些文件快速搭建项目所需的数据库环境,并了解各个数据表之间的关系和作用。 详细的开发文档:每个资源包都附有详细的开发文档,文档内容包括项目背景介绍、功能模块说明、系统流程图、用户界面设计以及关键代码解析等。这些文档为用户提供了深入的学习材料,使得即便是从零开始的开发者也能逐步掌握项目开发的全过程。 项目演示与使用指南:为帮助用户更好地理解和使用这些ASP项目,每个资源包中都包含项目的演示文件和使用指南。演示文件通常以视频或图文形式展示项目的主要功能和操作流程,使用指南则详细说明了如何配置开发环境、部署项目以及常见问题的解决方法。 毕业设计参考:对于正在准备毕业设计的学生来说,这些资源包是绝佳的参考材料。每个项目不仅功能完善、结构清晰,还符合常见的毕业设计要求和标准。通过这些项目,学生可以学习到如何从零开始构建一个完整的Web系统,并积累丰富的项目经验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值