`

c++调用java时最好设置自定义类路径

    博客分类:
  • C++
阅读更多
    最近在学习C++调用java类的流程,在按照网上示例做的过程中遇到了一些小问题,今天才得以彻底解决
     按照网上的例子做完后发现程序运行总是失败,原因在于自定义的类JVM无法找到,例子只说让自己编写自定义的类,但并没有说生成的类应该放在什么地方才可以被JVM正确的找到,通常根据需要我们的类是房子特定的目录下的,而且放在jvm路径下也是不安全的,所以在网上的大多数例子都缺少一步,设置自定义类的路径
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);  
}  


注意:
/*自定义类、库路径,相对或绝对,可设多个,分号隔开*/ 
  options[1].optionString = "-Djava.class.path=C:\\java\\RTMP\\bin;"; 
  options[2].optionString = " -Djava.library.path=C:\\java\\RTMP\\lib"; 
现在总算调试通过了,真高兴
分享到:
评论

相关推荐

    JAVA上百实例源码以及开源项目源代码

     util实现Java图片水印添加功能,有添加图片水印和文字水印,可以设置水印位置,透明度、设置对线段锯齿状边缘处理、水印图片的路径,水印一般格式是gif,png,这种图片可以设置透明度、水印旋转等,可以参考代码...

    JAVA上百实例源码以及开源项目

     util实现Java图片水印添加功能,有添加图片水印和文字水印,可以设置水印位置,透明度、设置对线段锯齿状边缘处理、水印图片的路径,水印一般格式是gif,png,这种图片可以设置透明度、水印旋转等,可以参考代码...

    java开源包1

    php调用java类 Java批量作业执行框架 MyBatchFramework MyBatchFramework 是一个开源的轻量级的用以创建可靠的易管理的批量作业的Java包,主要特点是多线程、调度、JMX管理和批量执行报表,执行历史等。 SIP协议包...

    Visual C++实践与提高-COM和COM+篇『PDF』

    11.6.5.2 设置去队列的路径 11.6.5.3 生成和打开队列 11.6.5.4 生成MSMQMessage对象 11.6.5.5 填入消息内容 11.6.5.6 发送消息 11.6.5.7 关闭队列 11.6.6 消息接收 11.6.7 MSMQ事件 11.6.7.1 生成消息事件对象 11.6....

    java开源包8

    php调用java类 Java批量作业执行框架 MyBatchFramework MyBatchFramework 是一个开源的轻量级的用以创建可靠的易管理的批量作业的Java包,主要特点是多线程、调度、JMX管理和批量执行报表,执行历史等。 SIP协议包...

    java开源包4

    php调用java类 Java批量作业执行框架 MyBatchFramework MyBatchFramework 是一个开源的轻量级的用以创建可靠的易管理的批量作业的Java包,主要特点是多线程、调度、JMX管理和批量执行报表,执行历史等。 SIP协议包...

    java开源包101

    php调用java类 Java批量作业执行框架 MyBatchFramework MyBatchFramework 是一个开源的轻量级的用以创建可靠的易管理的批量作业的Java包,主要特点是多线程、调度、JMX管理和批量执行报表,执行历史等。 SIP协议包...

    java开源包11

    php调用java类 Java批量作业执行框架 MyBatchFramework MyBatchFramework 是一个开源的轻量级的用以创建可靠的易管理的批量作业的Java包,主要特点是多线程、调度、JMX管理和批量执行报表,执行历史等。 SIP协议包...

    java开源包6

    php调用java类 Java批量作业执行框架 MyBatchFramework MyBatchFramework 是一个开源的轻量级的用以创建可靠的易管理的批量作业的Java包,主要特点是多线程、调度、JMX管理和批量执行报表,执行历史等。 SIP协议包...

    java开源包9

    php调用java类 Java批量作业执行框架 MyBatchFramework MyBatchFramework 是一个开源的轻量级的用以创建可靠的易管理的批量作业的Java包,主要特点是多线程、调度、JMX管理和批量执行报表,执行历史等。 SIP协议包...

    java开源包5

    php调用java类 Java批量作业执行框架 MyBatchFramework MyBatchFramework 是一个开源的轻量级的用以创建可靠的易管理的批量作业的Java包,主要特点是多线程、调度、JMX管理和批量执行报表,执行历史等。 SIP协议包...

    java开源包10

    php调用java类 Java批量作业执行框架 MyBatchFramework MyBatchFramework 是一个开源的轻量级的用以创建可靠的易管理的批量作业的Java包,主要特点是多线程、调度、JMX管理和批量执行报表,执行历史等。 SIP协议包...

    java开源包3

    php调用java类 Java批量作业执行框架 MyBatchFramework MyBatchFramework 是一个开源的轻量级的用以创建可靠的易管理的批量作业的Java包,主要特点是多线程、调度、JMX管理和批量执行报表,执行历史等。 SIP协议包...

    java开源包2

    php调用java类 Java批量作业执行框架 MyBatchFramework MyBatchFramework 是一个开源的轻量级的用以创建可靠的易管理的批量作业的Java包,主要特点是多线程、调度、JMX管理和批量执行报表,执行历史等。 SIP协议包...

    java开源包7

    php调用java类 Java批量作业执行框架 MyBatchFramework MyBatchFramework 是一个开源的轻量级的用以创建可靠的易管理的批量作业的Java包,主要特点是多线程、调度、JMX管理和批量执行报表,执行历史等。 SIP协议包...

    java 面试题 总结

    finalize是Object类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法,可以覆盖此方法提供垃圾收集时的其他资源回收,例如关闭文件等。 13、sleep() 和 wait() 有什么区别? sleep是线程类(Thread)的...

    Java资源包01

    php调用java类 Java批量作业执行框架 MyBatchFramework MyBatchFramework 是一个开源的轻量级的用以创建可靠的易管理的批量作业的Java包,主要特点是多线程、调度、JMX管理和批量执行报表,执行历史等。 SIP协议包...

    超级有影响力霸气的Java面试题大全文档

    finalize是Object类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法,可以覆盖此方法提供垃圾收集时的其他资源回收,例如关闭文件等。 16、sleep() 和 wait() 有什么区别? sleep是线程类(Thread)...

    华报智能报表工具

    华报智能报表工具(ReportAll)是开发人员最... 支持自定义函数,需要调用自定义函数时,系统产生事件,通过捕捉事件可以实现自定义函数。 界面个性化 设计报表文档时,支持配色方案的设计。 支持菜单的隐藏和显示。

Global site tag (gtag.js) - Google Analytics