最近在学习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";
现在总算调试通过了,真高兴
分享到:
相关推荐
1. **Java Socket编程**:Java的Socket类提供了网络通信的基础,服务端通常使用ServerSocket类监听特定端口,等待客户端连接。当连接建立后,通过Socket对象进行数据的读写。在这个项目中,Java服务端开启一个Socket...
最后,将生成的DLL库放置在Java应用程序的类路径下,或者指定的系统路径,Java程序可以通过`ProtocolInterface`类调用C++库的方法。 总结:使用JNI调用C++库的过程涉及Java和C++的协同工作,包括Java环境配置、JNI...
- **添加依赖**:首先,需要将JNA库和平台特定的库(如jna.jar和jna-platform.jar)添加到项目类路径中。在现代的Maven或Gradle项目中,可以通过配置依赖管理来实现。 - **定义接口**:创建一个Java接口,该接口...
在这个场景中,`jna.jar`是JNA的核心库文件,我们需要将其添加到Java项目的类路径中。 为了调用DLL,我们需要以下步骤: 1. **导入JNA库**:在Java项目中,引入`jna.jar`作为依赖,这样我们就可以使用JNA提供的...
### Java自定义类加载器(Class Loader)详解 #### 一、引言 在Java语言中,类加载机制是其动态特性的核心之一。通过类加载器(Class Loader),Java程序能够在运行时根据需要加载所需的类,从而实现高度的灵活性...
- **设置环境**:确保Java开发环境(JDK)已经安装,并在项目中添加`JNative.jar`到类路径(classpath)。 - **创建Java接口**:在Java代码中,声明一个本地方法,该方法会调用DLL中的函数。这些方法需要使用`...
JNA提供了一种简单的方式来调用C函数和其他本地库,使得Java开发者能够利用本地系统的功能,比如操作系统APIs,硬件接口等,而无需深入到C/C++的世界。 标题"JNA方式实现Java调用dll的必用jar包"指的是使用JNA库来...
1. **安装和引入JAWIN库**:首先,你需要下载JAWIN库,并将其添加到你的Java项目的类路径中。这通常通过在`pom.xml`(如果你使用Maven)或`build.gradle`(如果你使用Gradle)中配置依赖项来完成。 2. **创建DLL...
对于JNA,我们需要在项目的类路径中包含DLL库的路径,或者将其复制到系统的系统库路径下。对于JNI,需要将DLL文件和本地库链接在一起。 接着,我们需要定义Java接口来映射DLL中的函数。每个函数的参数类型和返回值...
- 设置JAVA_HOME环境变量,指向JDK的安装路径。 - 设置PATH环境变量,包含JDK的bin目录。 #### 三、创建DLL工程 **1. 打开VC2010** 启动Visual C++ 2010。 **2. 创建DLL工程** - 选择“文件”->“新建”->...
在IT行业中,C++和Java是两种非常重要的编程语言,广泛应用于系统开发、软件工程、游戏制作、服务器端编程等领域。对于求职者来说,掌握这两种语言的基本知识和高级特性是必不可少的。以下是一些可能在C++和Java面试...
### C++、C#、Java、Python 实现简单图形用户界面(GUI)的区别与方法 #### C++ 在C++中创建图形用户界面(GUI),主要依赖于Microsoft Foundation Classes(MFC)。MFC作为一套用于Windows应用程序开发的类库,...
2. **准备Java类库**:如果DLL文件与特定的Java类库关联,则需要确保该类库(例如文中提到的`AAbean.jar`)可用,并且已正确添加到项目的类路径中。 #### 三、部署DLL文件 部署DLL文件是调用它的关键步骤之一。...
一旦库被加载,你可以像调用Java方法一样调用本地函数: ```java int result = lib.addNumbers(3, 5); System.out.println("Result: " + result); ``` JNA还支持更复杂的数据类型,如结构体和指针,以及回调函数。...
4. **集成到项目**:生成的Java类可以直接引入到Java项目中,与JNA库一起使用,调用本地库的函数就像调用Java方法一样简单。 JNAerator的优势: - **简洁性**:相比JNI,JNAerator生成的代码更简洁,更易于理解和...
自定义类加载器需要继承`java.lang.ClassLoader`类,并重写`findClass`方法来实现自定义加载逻辑。 自定义类加载器的基本流程包括: 1. 重写`findClass`方法,实现类的查找与加载逻辑。 2. 通过调用`super.load...
根据给定的信息,本文将详细解释如何利用Java调用VC(Visual C++)音量控制程序,以此实现对计算机音量的监控与控制。这种方法基于Java的Runtime接口,能够跨语言地实现应用间的交互。 ### Java调用VC音量控制程序 ...
此外,C++还提供了重载操作符的能力,使得用户可以自定义类的行为,例如重载加法运算符以实现两个类对象的组合。 C++的类还可以通过模板实现泛型编程,这允许程序员编写能处理多种数据类型的通用代码。然而,C++的...
在实际应用中,考虑到Android设备的多样性,串口路径可能因设备而异,可能需要在运行时动态获取串口设备。同时,为了兼容不同版本的Android系统,你可能需要处理API级别的差异。另外,串口通信的稳定性、数据完整性...