关于c++调用java方法的问题,请大家指教

xiaoqin99 2008-10-17 05:02:11
关于c++调用java方法的问题,请大家指教


我要在c++中调用java的方法。
从 C/C++ 中调用 Java 代码,我严格按照以下几个步骤进行,执行以下步骤之前已经配置好相关环境,并且已经生成class文件:
1. 创建 JVM。调用 JNI_CreateJavaVM()。
2. 寻找要调用的类。调用 FindClass()。
3. 找到要调用的方法。调用 GetStaticMethodID()/GetMethodID()。
4. 运行方法。调用 CallStaticMethod()/CallMethod()。
5. 退出 JVM。调用 DestroyJavaVM()。


Vs2003 下能正常编译,但是执行时不能得到预期结果。


代码传不上去,我就只能贴上来,请大家见谅:
c++文件:
/ usingJavaClass.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"

#define JNI_VERSION_1_4 0x00010004
#pragma comment (lib,"jvm.lib")
#include <jni.h>
#include <windows.h>
typedef jint (JNICALL *JNICREATEPROC)(JavaVM **, void **, void *);
int main(){
JavaVM *jvm;
JNIEnv *env;
JavaVMInitArgs vm_args;
JavaVMOption options[3];
vm_args.version=JNI_VERSION_1_4;
/*设置初始化参数*/
options[0].optionString = "-Djava.compiler=NONE";
/*类路径,相对或绝对,可设多个,分号隔开*/
options[1].optionString = "-Djava.class.path=C:\\java\\RTMP\\bin;";
options[2].optionString = " -Djava.library.path=C:\\java\\RTMP\\lib";
options[3].optionString ="-verbose:jni";
vm_args.nOptions =3;
vm_args.options = options;
vm_args.ignoreUnrecognized = JNI_TRUE;
//------------------------------加载jvm:
HINSTANCE jvmDll = LoadLibrary("D:\\Program Files\\Java\\jre1.6.0_07\\bin\\client\\jvm.dll");
if (jvmDll == NULL) printf("加载JVM动态库错误。%l", ::GetLastError());
//查找JNI_CreateJavaVM过程。
JNICREATEPROC jvmCreateProc = (JNICREATEPROC)GetProcAddress(jvmDll, "JNI_CreateJavaVM");
if (jvmCreateProc == NULL)
{
FreeLibrary(jvmDll);
printf("查找JNI_CreateJavaVM过程错误。%l", ::GetLastError());
}
//创建JVM:

int res = (jvmCreateProc)(&jvm, (void **)&env, &vm_args);
if (res < 0 || jvm == NULL || env == NULL)
{
FreeLibrary(jvmDll);
printf( "创建JVM发生错误。");
}
//---------------------------------------------------------------------------------
jclass jcl = env->FindClass("RTMPHandshake");//加载启动类
if (env->ExceptionCheck() == JNI_TRUE || jcl == NULL)
{
FreeLibrary(jvmDll);
printf("加载启动类失败。");
}
jmethodID mid = env->GetMethodID(jcl,"generateResponse","([Ljava/lang/String;)V");//此处的参数意义见注解1
if (env->ExceptionCheck() == JNI_TRUE || mid == NULL)
{
FreeLibrary(jvmDll);
printf("查找启动方法失败。");
}
//-------------------------调用方法:
env-> CallObjectMethod( jcl, mid); //第3,4…参数就是被调方法的参数
FreeLibrary(jvmDll);
}


Java文件:
import java.io.*;

public class Test {
public static void main(String[] argv) {
for (int i = 0; i < 10; i ++) {
System.err.println(i);
}
}
}
...全文
133 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
xhs_lh04 2008-10-17
  • 打赏
  • 举报
回复
另外你的方法使用的也不对
启动JAVA虚拟机JNI_CreateJavaVM
找到类FindClass
找到类构造函数GetMethodID
创建类实例NewObject
找到你想要的方法GetMethodID
再后才CallObjectMethod
表态方法CallStaticObjectMethod
看我的博客里有详细介绍,做下广告先:)
http://blog.csdn.net/xhs_lh04/archive/2008/10/01/3006828.aspx
xhs_lh04 2008-10-17
  • 打赏
  • 举报
回复
JavaVMOption options[3];
options[0].optionString = "-Djava.compiler=NONE";
/*类路径,相对或绝对,可设多个,分号隔开*/
options[1].optionString = "-Djava.class.path=C:\\java\\RTMP\\bin;";
options[2].optionString = " -Djava.library.path=C:\\java\\RTMP\\lib";
options[3].optionString ="-verbose:jni";
vm_args.nOptions =3;
你的options数组大小不对,至少是4

64,647

社区成员

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

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