《Java深度历险》的第一个JNI小程序的Visual C++实现

来源:互联网 发布:nginx访问本地目录 编辑:程序博客网 时间:2024/06/05 03:33

《Java深度历险》第3章“Java与MS Office”,实际上讲的是如果用Java本地界面JNI写程序,即Java应用程序调用其它语言写的.dll库。 该书写于十余年前,用C++Builder写的示例dll库。把第3章第一个样例用现在的Visual C++ 2013实现一下,还是必要的。要点如下:


1. 我发现Visual C++ 2013新建项目竟然没有.dll项目!弄了半天才明白应该是新建Win32项目,然后下一步,可以选择是Win32还是Win32Console还是DLL等,这样就可以自动生成一个标准的C++ dll项目了。


2. 下述代码实现了《Java深度历险》第3章第86页的dll的主要函数的代码。说明两点:

2.1 使用Windows SDK的GetOpenFileName调用,必须要显式包含Commdlg.h。 即使windows.h已经包含了,仍然显示找不到GetOpenFileName等符号。咄咄怪事。

2.2 两个字符串用+连接,编译不过去。只好定义了C++的string型变量。

还好,最后测试通过。说明Java的向前兼容做得很好,十年前的jdk1.3到现在的jdk1.8,完全没问题。


#include "stdafx.h"#include  <io.h>#include <Commdlg.h>#include <string>JNIEXPORT void JNICALL Java_com_sun_edu_JavatoWord_NativeToWord(JNIEnv *env, jobject obj, jobjectArray context, jint count){OPENFILENAME ofn;char strFile[MAX_PATH];memset(&ofn, 0, sizeof(OPENFILENAME));memset(strFile, 0, sizeof(char)*MAX_PATH);ofn.lStructSize = sizeof(OPENFILENAME);ofn.lpstrFilter = "Word files (*.doc)\0*.doc*\0";ofn.lpstrFile = strFile;ofn.nMaxFile = MAX_PATH;ofn.Flags = OFN_FILEMUSTEXIST;if (GetOpenFileName(&ofn))//strFile得用户所选择文件路径和文件名 {//PathStripPath(strFile);//strFile得文件名} //檢查樣板檔是否存在if ((_access(strFile, 0)) == -1){MessageBox(NULL, "您所輸入的檔案並不存在,請重新輸入", "", MB_OK); return;}std::string ss = "您選擇的檔名為";ss += strFile;MessageBox(NULL, ss.c_str(), "", MB_OK);}


0 0