`

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与c++传文件程序

    1. **Java Socket编程**:Java的Socket类提供了网络通信的基础,服务端通常使用ServerSocket类监听特定端口,等待客户端连接。当连接建立后,通过Socket对象进行数据的读写。在这个项目中,Java服务端开启一个Socket...

    java的jni方式调用C++封装的库文件

    最后,将生成的DLL库放置在Java应用程序的类路径下,或者指定的系统路径,Java程序可以通过`ProtocolInterface`类调用C++库的方法。 总结:使用JNI调用C++库的过程涉及Java和C++的协同工作,包括Java环境配置、JNI...

    java使用(jna)调用c/c++第三方动态库 dll文件 所用jar包

    - **添加依赖**:首先,需要将JNA库和平台特定的库(如jna.jar和jna-platform.jar)添加到项目类路径中。在现代的Maven或Gradle项目中,可以通过配置依赖管理来实现。 - **定义接口**:创建一个Java接口,该接口...

    java调用C或者C++动态库dll测试jar包和测试dll

    在这个场景中,`jna.jar`是JNA的核心库文件,我们需要将其添加到Java项目的类路径中。 为了调用DLL,我们需要以下步骤: 1. **导入JNA库**:在Java项目中,引入`jna.jar`作为依赖,这样我们就可以使用JNA提供的...

    java自定义类加载classloader文档,包括代码

    ### Java自定义类加载器(Class Loader)详解 #### 一、引言 在Java语言中,类加载机制是其动态特性的核心之一。通过类加载器(Class Loader),Java程序能够在运行时根据需要加载所需的类,从而实现高度的灵活性...

    java调用dll必备jar包

    - **设置环境**:确保Java开发环境(JDK)已经安装,并在项目中添加`JNative.jar`到类路径(classpath)。 - **创建Java接口**:在Java代码中,声明一个本地方法,该方法会调用DLL中的函数。这些方法需要使用`...

    JNA方式实现Java调用dll的必用jar包

    JNA提供了一种简单的方式来调用C函数和其他本地库,使得Java开发者能够利用本地系统的功能,比如操作系统APIs,硬件接口等,而无需深入到C/C++的世界。 标题"JNA方式实现Java调用dll的必用jar包"指的是使用JNA库来...

    java使用jawin调用dll文件

    1. **安装和引入JAWIN库**:首先,你需要下载JAWIN库,并将其添加到你的Java项目的类路径中。这通常通过在`pom.xml`(如果你使用Maven)或`build.gradle`(如果你使用Gradle)中配置依赖项来完成。 2. **创建DLL...

    海康威视dll库调用java实例(实例多多)

    对于JNA,我们需要在项目的类路径中包含DLL库的路径,或者将其复制到系统的系统库路径下。对于JNI,需要将DLL文件和本地库链接在一起。 接着,我们需要定义Java接口来映射DLL中的函数。每个函数的参数类型和返回值...

    Java通过VC2010创建dll并调用

    - 设置JAVA_HOME环境变量,指向JDK的安装路径。 - 设置PATH环境变量,包含JDK的bin目录。 #### 三、创建DLL工程 **1. 打开VC2010** 启动Visual C++ 2010。 **2. 创建DLL工程** - 选择“文件”-&gt;“新建”-&gt;...

    C++和JAVA面试题

    在IT行业中,C++和Java是两种非常重要的编程语言,广泛应用于系统开发、软件工程、游戏制作、服务器端编程等领域。对于求职者来说,掌握这两种语言的基本知识和高级特性是必不可少的。以下是一些可能在C++和Java面试...

    C++,C#,Java,Python实现简单的图形用户界面的区别和方法

    ### C++、C#、Java、Python 实现简单图形用户界面(GUI)的区别与方法 #### C++ 在C++中创建图形用户界面(GUI),主要依赖于Microsoft Foundation Classes(MFC)。MFC作为一套用于Windows应用程序开发的类库,...

    JAVA调用第三方DLL的方法.doc

    2. **准备Java类库**:如果DLL文件与特定的Java类库关联,则需要确保该类库(例如文中提到的`AAbean.jar`)可用,并且已正确添加到项目的类路径中。 #### 三、部署DLL文件 部署DLL文件是调用它的关键步骤之一。...

    jna jar实现java调用dll

    一旦库被加载,你可以像调用Java方法一样调用本地函数: ```java int result = lib.addNumbers(3, 5); System.out.println("Result: " + result); ``` JNA还支持更复杂的数据类型,如结构体和指针,以及回调函数。...

    基于java的调用本地库 JNAerator.zip

    4. **集成到项目**:生成的Java类可以直接引入到Java项目中,与JNA库一起使用,调用本地库的函数就像调用Java方法一样简单。 JNAerator的优势: - **简洁性**:相比JNI,JNAerator生成的代码更简洁,更易于理解和...

    深入研究Java类加载机制 深入研究Java类加载机制

    自定义类加载器需要继承`java.lang.ClassLoader`类,并重写`findClass`方法来实现自定义加载逻辑。 自定义类加载器的基本流程包括: 1. 重写`findClass`方法,实现类的查找与加载逻辑。 2. 通过调用`super.load...

    用Java调用VC音量控制程序

    根据给定的信息,本文将详细解释如何利用Java调用VC(Visual C++)音量控制程序,以此实现对计算机音量的监控与控制。这种方法基于Java的Runtime接口,能够跨语言地实现应用间的交互。 ### Java调用VC音量控制程序 ...

    C++的类与C#的类

    此外,C++还提供了重载操作符的能力,使得用户可以自定义类的行为,例如重载加法运算符以实现两个类对象的组合。 C++的类还可以通过模板实现泛型编程,这允许程序员编写能处理多种数据类型的通用代码。然而,C++的...

    android串口调用,使用c开发的,可以设置串口超时

    在实际应用中,考虑到Android设备的多样性,串口路径可能因设备而异,可能需要在运行时动态获取串口设备。同时,为了兼容不同版本的Android系统,你可能需要处理API级别的差异。另外,串口通信的稳定性、数据完整性...

Global site tag (gtag.js) - Google Analytics