c++调用Java函数问题

yeluoshafei 2014-04-21 03:04:26
现在有一个Java函数,如下:
[java]
01.public boolean Connect(String hostname, int port, String username,
02. String password) throws IOException {
03. ftpClient.connect(hostname, port);
04. System.out.println("正在连接到服务器" + hostname + ".........");
05. ftpClient.setControlEncoding("GBK");
06. if (FTPReply.isPositiveCompletion(ftpClient.getReplyCode())) {
07. if (ftpClient.login(username, password)) {
08. System.out.println("登陆成功");
09. return true;
10. } else
11. System.out.println("登陆失败!");
12. }
13. disConnect();
14. return false;
15. }


用到的jar包为commons-net-3.3。我用如下代码调用,结果不对,没有连接,不知道问题出在哪,请教各位大神了。



[cpp]
01.JavaVMOption options[1];
02.JNIEnv *env; //表示JNI执行环境
03.JavaVM *jvm; //指向JVN的指针,用来创建、初始化、销毁JVM
04.JavaVMInitArgs vm_args; //用来初始化JVM的各种参数
05.long status;
06.jclass cls;
07.jmethodID mid;
08.jboolean not;
09.jobject obj;
10.options[0].optionString = "-Djava.class.path=commons-net-3.3.jar;.;";
11.//设置JVM初始化参数
12.vm_args.version = JNI_VERSION_1_2;
13.vm_args.nOptions = 1;
14.vm_args.options = options;
15.status = JNI_CreateJavaVM(&jvm, (void**)&env, &vm_args);//创建JVM,成功返回0,失败返回JNI_ERR
16.f(status!=JNI_ERR){
17. cls=env->FindClass("ftpTest/TestFtp");
18. if(cls!=0){
19. mid=env-GetMethodID(cls,"Connect","(Ljava/lang/String;ILjava/lang/String;Ljava/lang/String;)Z");
20.
21. if(mid!=0){
22. not=env->CallBooleanMethod(cls,mid,"127.0.0.1", 2121, "cq", "123");
23. if(not)
24. std::cout<<"连接成功"<<std::endl;
25. }
26. }
27. jvm->DestroyJavaVM();
28.
29.}


请教各位大神了。
...全文
141 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
sduxiaoxiang 2014-04-22
  • 打赏
  • 举报
回复
mid=env-GetMethodID(cls,"Connect","(Ljava/lang/String;ILjava/lang/String;Ljava/lang/String;)Z"); 不是3个String参数么?调用貌似有4个吧。。
赵4老师 2014-04-22
  • 打赏
  • 举报
回复
不要做A语言代码修改为B语言代码的无用功。 也不要做用A语言代码直接调用B语言代码库这样复杂、这样容易出错的傻事。 只需让A、B语言代码的输入输出重定向到文本文件,或修改A、B语言代码让其通过文本文件输入输出。 即可很方便地让A、B两种语言之间协调工作。 ——架构师zhao4zhong1
赵4老师 2014-04-22
  • 打赏
  • 举报
回复
任何函数都可以变形为: 文本输入→函数功能→文本输出
赵4老师 2014-04-22
  • 打赏
  • 举报
回复
引用 5 楼 yeluoshafei 的回复:
[quote=引用 3 楼 zhao4zhong1 的回复:] 不要做A语言代码修改为B语言代码的无用功。 也不要做用A语言代码直接调用B语言代码库这样复杂、这样容易出错的傻事。 只需让A、B语言代码的输入输出重定向到文本文件,或修改A、B语言代码让其通过文本文件输入输出。 即可很方便地让A、B两种语言之间协调工作。 ——架构师zhao4zhong1
可是需要在A中使用B的函数,怎么办呢?[/quote] 用B写一个调用这个函数的exe 然后 A.exe | B.exe
yeluoshafei 2014-04-22
  • 打赏
  • 举报
回复
引用 4 楼 sduxiaoxiang 的回复:
mid=env-GetMethodID(cls,"Connect","(Ljava/lang/String;ILjava/lang/String;Ljava/lang/String;)Z"); 不是3个String参数么?调用貌似有4个吧。。
Connect函数中定义了四个参数,"(Ljava/lang/String;ILjava/lang/String;Ljava/lang/String;)Z“是用javap反编译出来的,只有三个参数
FancyMouse 2014-04-22
  • 打赏
  • 举报
回复
喷了开始自称架构师了。
yeluoshafei 2014-04-22
  • 打赏
  • 举报
回复
引用 3 楼 zhao4zhong1 的回复:
不要做A语言代码修改为B语言代码的无用功。 也不要做用A语言代码直接调用B语言代码库这样复杂、这样容易出错的傻事。 只需让A、B语言代码的输入输出重定向到文本文件,或修改A、B语言代码让其通过文本文件输入输出。 即可很方便地让A、B两种语言之间协调工作。 ——架构师zhao4zhong1
可是需要在A中使用B的函数,怎么办呢?
yeluoshafei 2014-04-21
  • 打赏
  • 举报
回复
大神都在哪里呀
yeluoshafei 2014-04-21
  • 打赏
  • 举报
回复
更正,c++代码中第16行为if(status!=JNI_ERR){

64,637

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧