C或C++调用java jvm创建不成功

livpu 2008-12-24 05:03:01
程序编译链接没问题,运行时提示找不到jvm.dll
jvm.dll所在目录为:D:\Java\jdk1.5.0_16\jre\bin\client
该路径已加到Path环境下。
把jvm拷贝到debug目录下后,运行没问题,但执行函数:
long status = JNI_CreateJavaVM(&jvm, (void**)&env, &vm_args);
后返回值为-1,jvm创建不成功。

引用前辈的一段话:
-----------------------------------------
这里需要提出的是,某些开发人员为了方便直接将JRE所用到的DLL文件直接拷贝到系统目录下。这样做是不行的,将导致初始化Java虚拟机环境失败(返回值-1),原因是Java虚拟机是以相对路径来寻找所用到的库文件和其它一些相关文件的。
----------------------------------------

从这儿可以看出我是因为把jvm.dll拷贝的debug目录下的原因造成的
但怎样才能不拷贝过去,又能顺利找到jvm.dll呢?




代码如下:

#include "stdafx.h"
#include "jni.h"
#include <iostream.h>

int main(int argc, char* argv[])
{
JavaVMOption options[1];
JNIEnv * env;
JavaVM * jvm;
JavaVMInitArgs vm_args;
options[0].optionString = "-Djava.class.path=.";
vm_args.version = JNI_VERSION_1_4;
vm_args.nOptions = 1;
vm_args.options = options;
vm_args.ignoreUnrecognized = JNI_TRUE;
long status = JNI_CreateJavaVM(&jvm, (void**)&env, &vm_args);
if (status == JNI_ERR)
{
cout<<"Can not create JVM"<<endl;
return -1;
}
printf("Created JVMn");
jclass cls = env->FindClass("org/Native/JavaNative");
printf("getClsn");
cout<<cls<<endl;
if (cls !=0)
{
jmethodID mid = env->GetStaticMethodID(cls, "testReturn", "()I");
printf("getMidn");
if (mid !=0)
{
printf("testReturnn");
int result=env->CallStaticIntMethod(cls, mid);
printf("call over result=%dn",result);
}
mid = env->GetStaticMethodID(cls, "testPrint", "()V");
if (mid !=0)
{
printf("testPrintn");
env->CallStaticVoidMethod(cls, mid);
}
mid = env->GetStaticMethodID(cls, "testInput", "(I)I");
if (mid !=0)
{
printf("testInputn");
int result=env->CallStaticIntMethod(cls, mid,22);
printf("call over result=%dn",result);
}
mid = env->GetMethodID(cls,"<init>","()V");
if (mid != 0)//获取方法成功
{
printf("ctro!=0n");
jobject obj=env->NewObject(cls, mid);
printf("new objectn");
mid = env->GetMethodID(cls, "testInstance","(I)I");
if (mid!=0)//获取方法成功
{
printf("methodID!=0n");
jint result=env->CallIntMethod( obj, mid,22);
cout<<result<<endl;
}
}
}
jvm->DestroyJavaVM();
return 0;
}
...全文
430 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
liberpc 2008-12-26
  • 打赏
  • 举报
回复
学习支持
CoffeeCN 2008-12-26
  • 打赏
  • 举报
回复
to: livpu
如果发送的是字符串,注意单双字节。
lzh9955 2008-12-25
  • 打赏
  • 举报
回复
up
livpu 2008-12-25
  • 打赏
  • 举报
回复
to:CoffeeCN

创建jvm的问题已经解决了,是我太粗心,Path路径设置的有问题
还有个问题要请教下:
假如C++这边有大量数据需要发送,但是发送的接口是由java封装的
通过jni调用java API来实现可行不?有没有潜在的问题?
livpu 2008-12-25
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 CoffeeCN 的回复:]
Lz的版本不是1.5吗
JNI_VERSION_1_4这个怎么是1.4?
[/Quote]

jdk确实是1.5,但jni.h中定义的版本最大到JNI_VERSION_1_4
CoffeeCN 2008-12-25
  • 打赏
  • 举报
回复
Lz把bin下所有DLL都考过去试一下,加了PATH以后记得重启VC
CoffeeCN 2008-12-25
  • 打赏
  • 举报
回复
Lz的版本不是1.5吗
JNI_VERSION_1_4这个怎么是1.4?
pingzi_1119 2008-12-25
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 nullah 的回复:]
没用过
帮顶~~~
[/Quote]
up
明台 2008-12-24
  • 打赏
  • 举报
回复
没想到 还可以这样
nullah 2008-12-24
  • 打赏
  • 举报
回复
没用过
帮顶~~~
livpu 2008-12-24
  • 打赏
  • 举报
回复
高手帮忙
分不够可以另加
waizqfor 2008-12-24
  • 打赏
  • 举报
回复
没调过虚拟机啊 UP UP

64,637

社区成员

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

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