用VC++ 6.0实现JNI的例子

JNI是JDK的一部分,用于为Java提供一个本地代码的接口。通过使用JNI编写的程序能够 确保你的代码能够完全的移植到所有的平台。JNI使得运行在JVM虚拟机上的Java代码能够操 作使用其它语言编写的应用程序和库,比如C/C++以及汇编语言等。此外JNI提供的某些API还 允许你把JVM嵌入到本地应用程序中。下图表达了JNI所扮演的角色。

本文将通过一个 实例来阐述使用VC++6.0来实现JNI的完整过程。使用JNI来整合本地代码和Java代码的步骤是 确定的,没有再创作的余地,所以读者可以通过本文的步骤来逐步认识到,其实Java也是 "没有什么不可以"的。

一、JNI的实现任务描述:在Java中调用windows下 的消息框函数,并且从Java中传递一个字符串作为MessageBox函数的显示文本参数,显示在 消息框的中间。下面让我们一起进入这一奇妙的旅程。

Step 1:写一个Java类,在这 个类中包含了需要调用的本地方法的描述。

//WinMsgBox.java
package edu.netcom.jni;
public class WinMsgBox 
{
  static{
     System.loadLibrary("WinMsgDll");  // (1)
  }
  public native void showMsgBox(String str); // (2)
}

(1)中WinMsgDll是 动态链接文件的文件名,不用加扩展名,因为在不同的平台下动态链接文件扩展名是不同的 ,由JVM自动识别,比如在Solaris下,会被转换为WinMsgDll.so;而Win32环境下会转换为 WinMsgDll.dll。这个文件名必须和Step 4中生成的文件名一致。这个文件的存放位置也很重 要,它只能被放在JVM属性值java.library.path中指定的文件夹中。这个属性值可以使用 System.getProperty("java.library.path");来查看。一般情况下,至少放在这 几个位置是确定可靠的,windows安装目录下的system32下面,JDK安装目录下的bin下面,以 及调用主类文件的当前目录。

(2)中指明了你必须用本地代码实现的方法。

Step 2:提示符下使用命令javac -d . WinMsgBox.java编译Step 1编写的java文件 。

此时会在当前目录下建立一个edu\netcom\jni目录结构,并且一个WinMsgBox.class文件存在其中。

Step 3:提示符下使 用命令javah -jni edu.netcom.jni.WinMsgBox,此时会在当前目录下产生一个 edu_netcom_jni_WinMsgBox.h文件,注意这个文件名是由(包名+类名)组成,中间用(_) 隔开。此文件内容如下:

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>            // (1)
/* Header for class edu_netcom_jni_WinMsgBox */
#ifndef _Included_edu_netcom_jni_WinMsgBox
#define _Included_edu_netcom_jni_WinMsgBox
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class:   edu_netcom_jni_WinMsgBox
* Method:  showMsgBox
* Signature: (Ljava/lang/String;)V    // (2)
*/
JNIEXPORT void JNICALL Java_edu_netcom_jni_WinMsgBox_showMsgBox
  (JNIEnv *, jobject, jstring);      // (3)
#ifdef __cplusplus
}
#endif
#endif

时间: 2024-10-30 08:07:08

用VC++ 6.0实现JNI的例子的相关文章

跪求大神-vc++6.0出现error spawning cl .exe怎么解决

问题描述 vc++6.0出现error spawning cl .exe怎么解决 程序是对的一编译就出现error spawing cl.exe用的是win8.1系统.......求各位大神解答 解决方案 如果你的程序没有问题,那是因为vc++ 6.0和windows 8.1的不兼容造成的如果你坚持使用vc++6.0,并且不打算用虚拟机(虚拟机,xp上跑VC++ 6是最佳做法) 参考:http://download.csdn.net/album/detail/639下载我提供的VC++和http

在低版本的vc中使用vc 10.0的新特性

/*! 在低版本的vc中使用vc 10.0的新特性 created by : andrew.wu (erpingwu@gmail.com) */ vc 10.0提供了一些新的特性,最引人注目的莫过于lambda, 但vs2010 beta内存占用之多也不得不让人心生退让. 高手 7cat 指出 "vc ide 只是一个壳" 那么如果利用 vc 10.0 编译器的新功能? 以vc9为例, 注意 Tools->Projects and Solutions->VC++ Direc

水晶报表在VC++6.0中的简单使用方法

水晶报表是一个报表设计开发的强大工具,功能强大,设计灵活,在水晶报表光盘中只提供了一个完全动态生成报表的例子,使用繁琐.现介绍其在VC++6.0中的简单使用方法.编译环境:VC++6.0 sp5 .Windows 2000 Server sp3 (en).一.导入水晶报表使用的动态联接库:根据实际修改文件路径. #import "C:\Documents and Settings\Administrator\桌面\cr\craxdrt9.dll" no_namespace 二.定义接口

在VC++6.0下可以运行,但是移植到VS2003之后就不行了

问题描述 用DBLibrary和数据库连接有一个例子physic在VC++6.0下可以运行,但是移植到VS2003之后就不行了,不知道为什么,应该怎么设置?程序地址见file:///E:/HLA/SQL/VC++中使用%20DB-Library%20编程(SQL%20Server)%20一/VC++中使用%20DB-Library%20编程(SQL%20Server)%20-%20VC知识库文章.htm 解决方案 解决方案二:属性里面设置静态链接

代码-vc 6.0 error c2491 报错啊,头大

问题描述 vc 6.0 error c2491 报错啊,头大 简单又奇怪的问题又来了... debug版完全正常:release版报错c2491. definition of dllimport function not allowed. (我是接手的别人的项目,项目工程代码里没有看到有dllimport 或者是其他明显的问题啊). 解决方案 检查一下你Release版本跟Debug版本的工程配置,尤其预编译宏的设置. 应该有宏定义不一致,导致dllexport,dllimport的导入 解决方

环境-vc++6.0内关于s=(i++)*(i++)的问题

问题描述 vc++6.0内关于s=(i++)*(i++)的问题 int i = 0: s = (i++)*(i++) printf("%d",s): 这个结果应该是多少?我个人分析应该是2,第一个i++使用的是1 然后i的值应该变成2然后第二个i使用的是2 然后i变成3 结果s的值应该是2 但是在vc++6.0的环境下运行结果为什么是1呢?新手求解. 解决方案 这个问题问了无数遍,我想这么告诉你. 就C++语言来说,这个是语言未定义行为,所谓语言未定义行为,就是在语言规范中没有规定遇到

VC++6.0如何添加头文件(graphics.h)??

问题描述 VC++6.0如何添加头文件(graphics.h)?? 'graphics.h': No such file or directory Error executing cl.exe. 编译中出现这个问题(本人初学者),网上说要添加头文件,按照网上的教程结果错误更多了,头文件添加不成功,请求大神支援,怎么破??? (详细一点可以么?最好附上截图,万分感谢!) 解决方案 初学者的话,建议你换Borland C++或者Turbo C++ 这是是属于DOS时代Borland搞出来的一个绘图库

工程-vc++6.0写的程序用vs2010打开需要改变些什么

问题描述 vc++6.0写的程序用vs2010打开需要改变些什么 要整理一个程序 ,不是自己写的,原来是vc++6.0写的,现在用vs2010打开报一些很奇怪的错,都指向头文件,complex 还有string 搞了很长时间了,哪位大神给解答一下,小弟感激不尽啊,谢谢 解决方案 这可能是头文件的错误.因为不同的编译器可能将库文件放在不同的头文件中,所以要想把错误改正,需要了解需要的头文件放在那个库中.其实用遵循统一标准的编译器就可以避免这些问题,可以用linux gcc 编译器! 解决方案二:

VC++ 6.0 单步调试【写给自己看的调试总结帖】

写给自己看的调试总结帖 参考一: 先将光标移动到你需要停止的地方,点击一下工具栏中的小手工具,这个时候左边会有一个红色的圆点出现,然后点击"go F5"工具.程序会开始运行,直到运行到你设置的断点处停下来,这个时候你可以在下边的出口中检查你的变量的值 了.如果下面没有你需要的变量,你可以将变量名拖到变量窗口中. 如果你的变量窗口没有显示,你可以通过菜单-->查看-->调试窗口--->watch 打开它. 参考二: 逐过程调试-F10 逐语句调试-F11 跳到光标处-C