《Java深度历险》的第一个JNI小程序的Visual C++实现,
分享于 点击 7110 次 点评:272
《Java深度历险》的第一个JNI小程序的Visual C++实现,
《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);
}
相关文章
- 暂无相关文章
用户点评