C++调用Java方法时jvm.dll相关错误 【每次记录完后都被瞬间解决了……】
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了C++调用Java方法时jvm.dll相关错误 【每次记录完后都被瞬间解决了……】,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2864字,纯文字阅读大概需要5分钟。
内容图文
在编程的学习过程中,愈发感觉到了女性思维在这方面的局限性。
背景介绍:
为了学习JNI中C++对Java的调用,在阅读《JNI技术手册》的同时加以练习。但根据示例代码编写过程中总出现各种
奇怪的问题(一度后悔自己装了win7 64位系统,而电脑之前是预装win8 32位的...)。由于Java部分的代码非常简单,
没有出现任何错误,javac、javah命令也能正常输出.class文件和头文件。但C++部分却报错了。所学习的示例代码意图
通过C++调用Java,生成一个.exe的启动文件。
Java代码如下:
1 public class C2Java { 2 3 public C2Java(){ 4 super (); 5 } 6 7 public static int add(int a,int b){ 8return a+b; 9 } 1011publicboolean judge(boolean bool){ 12return !bool; 13 } 14 }
C++代码如下:
// c2java.cpp : 定义控制台应用程序的入口点。 #include " stdafx.h " #include " windows.h " using namespace std; int main(int argc, char* argv[]) { JavaVMOption options[1]; JNIEnv *env; JavaVM *jvm; JavaVMInitArgs vm_args; long status; jclass cls; jmethodID mid; jint square; jboolean not; jobject jobj; options[0].optionString = "-Djava.class.path=."; vm_args.version = JNI_VERSION_1_6; vm_args.nOptions = 1; vm_args.options = options; vm_args.ignoreUnrecognized = JNI_TRUE; status = JNI_CreateJavaVM(&jvm,(void**)&env,&vm_args); if(status != JNI_ERR) { cls = env->FindClass("C2Java"); if(cls !=0) { mid = env->GetStaticMethodID(cls, "add", "(II)I"); if(mid !=0) { square = env->CallStaticIntMethod(cls, mid, 5, 5); std::cout << square << std::endl; } mid = env->GetMethodID(cls, "<init>", "()V"); if(mid !=0) { jobj=env->NewObject(cls, mid); std::cout << "init ok"<< std::endl; } mid = env->GetMethodID(cls, "judge", "(Z)Z"); if(mid !=0) { not= env->CallBooleanMethod(jobj, mid, 1); if(!not) { std::cout << "Boolean ok"<< std::endl; } } } jvm->DestroyJavaVM(); return0; } elsereturn -1; }
由于创建jvm过程中可以通过两种方式加载jvm.dll动态链接库文件,在两种方式的尝试中发现了截然不同的错误。
错误内容:
错误1:使用如上代码,通过在path中添加jvm.dll路径、在工程/属性/链接器/输出中添加jvm.lib依赖库,实现dll文件的静态加载。反复测试了很多次,
始终报错如下:
单步调试似乎也不能使用,查阅相关资料,将console改为window报的错更多…… 之后又仔细搜寻相关教程,根据:http://andy-li-chn.iteye.com/blog/1175075
的说法:“自定义的类JVM无法找到,例子只说让自己编写自定义的类,但并没有说生成的类应该放在什么地方才可以被JVM正确的找到。通常根据需要我们的类是放在特定
的目录下的,而且放在jvm路径下也是不安全的,所以在网上的大多数例子都缺少一步,设置自定义类的路径 "。根据这个思路,决定自定义类路径并动态加载dll文件。
错误2: 将自己的C++代码相关部分修改为:
// 定义一个函数指针,下面用来指向JVM中的JNI_CreateJavaVM函数 typedef jint (WINAPI *PFunCreateJavaVM)(JavaVM **, void **, void *); constchar szJvmPath[] = "C:\\Program Files\\Java\\jdk1.7.0_51\\jre\\bin\\server\\jvm.dll"; HINSTANCE hInstance = ::LoadLibrary(szJvmPath); if (hInstance == NULL) { cout<< "LoadLibrary False"<<endl; cout<<::GetLastError()<<endl; return -2; } //取得里面的JNI_CreateJavaVM函数指针 PFunCreateJavaVM funCreateJavaVM = (PFunCreateJavaVM)::GetProcAddress(hInstance, "JNI_CreateJavaVM"); status = (*funCreateJavaVM)(&jvm, (void**)&env, &vm_args);
运行后返回值为-2,GetLastError的内容为193,意思是动态加载dll文件失败了。设置断点查看各变量内容时,发现LoadLibrary的返回值为空。查阅资料后
进行修改仍不能正常运行。目前还未找到方法来成功解决此问题T.T
运行。
快拯救我吖神奇的博客园... 只希望每次愚蠢的错误都能深深印刻在我的脑海里……
原文:http://www.cnblogs.com/annaivsu/p/3959175.html
内容总结
以上是互联网集市为您收集整理的C++调用Java方法时jvm.dll相关错误 【每次记录完后都被瞬间解决了……】全部内容,希望文章能够帮你解决C++调用Java方法时jvm.dll相关错误 【每次记录完后都被瞬间解决了……】所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。