VS2010 C++调用Java的Jar包

在网上看了一圈,只有一个示例代码,而且运行有错误,下面给出正确代码:

JarAppCall.h

 1 #pragma once
 2
 3
 4 class CJarAppCall
 5 {
 6 public:
 7     CJarAppCall(void);
 8     ~CJarAppCall(void);
 9
10     /*
11     @brief 执行Jar包调用,等待执行完成返回
12     @param[in] strJarDir jar包目录
13     @param[in] strJarName jar包名称
14     @return 执行是否成功
15     */
16     bool Run(const CString& strJarDir, const CString& strJarName);
17
18 private:
19     bool CallApp(const CString& strJarName);
20 };  

JarAppCall.cpp

 1 #include "StdAfx.h"
 2 #include "JarAppCall.h"
 3
 4 CJarAppCall::CJarAppCall(void)
 5 {
 6 }
 7
 8
 9 CJarAppCall::~CJarAppCall(void)
10 {
11 }
12
13 bool CJarAppCall::Run(const CString& strJarDir, const CString& strJarName)
14 {
15     //缓存当前目录
16     WCHAR sOldDir[MAX_PATH] = {0};
17     GetCurrentDirectory(MAX_PATH, sOldDir);
18
19     //设置当前目录为jar包目录
20     SetCurrentDirectory(strJarDir);
21     bool bCalRest = CallApp(strJarName);
22     //还原当前目录
23     SetCurrentDirectory(sOldDir);
24
25     return bCalRest;
26 }
27
28 bool CJarAppCall::CallApp(const CString& strJarName)
29 {
30     WCHAR sSysDir[MAX_PATH] = {0};
31     GetSystemDirectory(sSysDir, MAX_PATH);
32     CString strFullPath = *sSysDir;
33     strFullPath += _T(":\\cmd.exe");
34     CString strCmdLine = _T(" /C ");
35     strCmdLine += _T("java -jar ");
36     strCmdLine += strJarName;
37
38     STARTUPINFO si = {sizeof(si)};
39     PROCESS_INFORMATION pi;
40     BOOL bRunProgram = CreateProcess(strFullPath.GetBuffer(),
41         strCmdLine.GetBuffer(), NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi);
42
43     strFullPath.ReleaseBuffer();
44     strCmdLine.ReleaseBuffer();
45
46     if (!bRunProgram)
47     {
48         return false;
49     }
50
51     // 等待程序结束
52     WaitForSingleObject(pi.hProcess,INFINITE);
53     CloseHandle(pi.hProcess);
54
55     return true;
56 }  

这里要注意,33行是:\\cmd.exe,其他网站漏掉了冒号;而且这样设置路径就要在windows/system32下把cmd.exe复制到C盘根目录下。

main.cpp

 1 #include "afx.h"
 2 #include <WinDef.h>
 3 #include <string>
 4 #include <wchar.h>
 5 #include <tchar.h>
 6 #include <iostream>
 7 #include "JarAppCall.h"
 8 using namespace std;
 9
10 int main()
11 {
12     CString strJarDir = _T("D:\\ICBCdriverJAVA1\\ICBCdriverJAVA1");
13     CString strJarName = _T("ChinaBank.jar");
14
15     CJarAppCall jarCall;
16     if (!jarCall.Run(strJarDir, strJarName))
17     {
18         //启动失败
19         printf("fail!");
20         return -1;
21     }
22 }

这里最好把提示信息的那个AfxMessageBox(_T("启动失败"));  删掉,容易报错。字符集最好设置为Unicode。MFC使用设置为在共享DLL中使用MFC(可能因为CString是MFC的东西,这个不是太懂,看网上的帖子摸索出来的)。

时间: 2024-10-28 19:07:11

VS2010 C++调用Java的Jar包的相关文章

jmeter接口测试-调用java的jar包-csv参数化请求-BeanShellPreProcessor生成验签作为请求验证参数-中文乱码----实战

背景及思路: 需求:要做 创建新卡 接口的测试,要求: 1. 不需要每次手动修改请求参数. 方案:文中先用excle将数据准备好,导出为csv格式,再用jmeter的csv请求进行参数化 2. 卡号需要唯一: 方案:文中用jmeter的beanshell按时间戳加随机数生成 3. 请求参数中有一个参数,会根据相应的请求参数生成(文中的sign值),接口请求会验证sign是否和相应请求参数对应: 方案: 1. 文中将生成sign的源码打包放在jmeter的lib\ext\ 下, 2. 再用jmet

C++调用Java的Jar包

一个简单需求:用C++调用Jar包. 实现基本思路:调用CreateProcess API来启动cmd.exe执行jar包. 调用类CJarAppCall. JarAppCall.h #pragma once class CJarAppCall { public: CJarAppCall(void); ~CJarAppCall(void); /* @brief 运行Jar包调用,等待运行完毕返回 @param[in] strJarDir jar包文件夹 @param[in] strJarName

Java常用jar包用途

Java常用jar包用途: USAGE INDEX JAR NAME USAGE 1 ASM asm-2.2.3.jar ASM字节码库 2 ASM asm-commons-2.2.3.jar ASM字节码库 3 ASM asm-util-2.2.3.jar Java字节码操纵和分析框架 4 COMMONS commons-discovery-0.2.jar 用来发现.查找和实现可插入式接口,提供一些一般类实例化.单件的生命周期管理的常用方法. 5 COMMONS commons-beanuti

Java常见Jar包的用途

jar包 用途 axis.jar SOAP引擎包 commons-discovery-0.2.jar 用来发现.查找和实现可插入式接口,提供一些一般类实例化.单件的生命周期管理的常用方法. jaxrpc.jar Axis运行所需要的组件包 saaj.jar 创建到端点的点到点连接的方法.创建并处理SOAP消息和附件的方法,以及接收和处理SOAP错误的方法. wsdl4j-1.5.1.jar Axis运行所需要的组件包 activation.jar JAF框架的jar包 annotations-a

(转)java 从jar包中读取资源文件

(转)java 从jar包中读取资源文件 博客分类: java 源自:http://blog.csdn.net/b_h_l/article/details/7767829 在代码中读取一些资源文件(比如图片,音乐,文本等等),在集成环境(Eclipse)中运行的时候没有问题.但当打包成一个可执行的jar包(将资源文件一并打包)以后,这些资源文件找不到,如下代码:Java代码 [java] view plaincopy //源代码1: package edu.hxraid; import java

SoapUI调用自写Jar包

soapui能够使用groovy脚本,脚本中可以调用自己编写的jar包,使用中会遇到一些问题,下面进行一些记录 soapui调用自写jar包 1.编写jar代码并调试测试成功 2.打包jar包 eclipse中鼠标右键到需要打包的项目-Export-Java-JAR file-Next-选中项目下manifest.mf文件和需要打包的方法-指定jar包存储路径和jar包名称-Finish 3.拷贝jar到指定soapui路径 * \SoapUI-Pro-5.1.2\bin\ext\ *为soap

Kettle中调用用户自定义的jar包

ETL工具断断续续的也接触了 Informatica,Kettle, SSIS,个人感觉Info很强大但是也很贵,而且有着一些神秘感.Kettle 4.0版本以来已经有了User  defined java class组件,使用户可以写Java代码 让kettle来调用,这就说明了很多kettle不能处理的东西我们可以通过Java代码来实现,步骤如下: 一:创建Java  Project   二:导出Jar包 在main方法中测试Java Project方法无误后 ,导出为jar包,如下图所示

C#调用java的jar文件的方法(转)

一.将已经编译后的java中Class文件进行打包: Eclipse或myeclipse进行Export选择jar即可.或者使用命令 如:将某目录下的所有class文件夹全部进行打包处理: 使用的命令:jar cvf test.jar -C com/ . 其中test.jar为要生成的jar包:com/ . 为指定的当前目录下的文件夹,该文件夹包括子文件夹及class文件: cmd->到java class文件目录下->jar  cvf    要生成的jar包名称.jar    java类文件

Delphi XE7的安卓程序如何调用JAVA的JAR,使用JAVA的类?

本文使用工具和全部源码下载: http://download.csdn.net/detail/sunylat/8190765 为什么我们要在Delphi XE7的安卓程序调用Java的JAR,使用JAVA的类?如果能够这样做,那么就意味着我们把Delphi开发的安卓程序扩展到了一个更大的开发范围了,理论上可以调用任意JAVA编写的代码,对于同时精通Delphi和JAVA的程序员来说,简直如虎添翼!! 我差不多用了一天时间吧,最终在老猫的帮助下,成功实现了在Delphi XE7的安卓程序中调用JA