`

C++ 代码创建虚拟机调用java方法

 
阅读更多
Java 和 C/C++代码的互相调用一般都是采用JNI的方法,首先Java 类 J 通过native函数调用在 对应的C++文件C中的方法,C文件保存相应的虚拟机和JNIEnv等变量,获取java类中的方法或者属性的ID,进而回调J中的方法。但有时候需要直接从C++的方法中调用java的方法,这就需要在C++代码中创建虚拟机,从而直接调用java中的代码。


#include <jni.h>
#include <stdio.h>

int main(int argc, char** argv){
    JavaVM* vm;
    JNIEnv* env;
    JavaVMInitArgs vm_args;
    vm_args.version = JNI_VERSION_1_4;
    vm_args.nOptions = 0;
    vm_args.ignoreUnrecognized = 1;
    // Construct a VM
    jint res = JNI_CreateJavaVM(&vm, (void **)&env, &vm_args);
    // Construct a String
    jstring jstr = env->NewStringUTF("Hello World");
    // First get the class that contains the method you need to call
    jclass clazz = env->FindClass("java/lang/String");
    // Get the method that you want to call
    jmethodID to_lower = env->GetMethodID(clazz, "toLowerCase", "()Ljava/lang/String;");
    // Call the method on the object
    jobject result = env->CallObjectMethod(jstr, to_lower);
    // Get a C-style string
    const char* str = env->GetStringUTFChars((jstring) result, NULL);
    printf("%s\n", str);
    // Clean up
    env->ReleaseStringUTFChars(jstr, str);
    // Shutdown the VM.
    vm->DestroyJavaVM();

}
编译如下:

$ export LD_LIBRARY_PATH=/....../jdk1.6.0_26/jre/lib/i386/server/         #路径指向包含 libjvm.so 文件的目录

$ g++ -I/....../jdk1.6.0_26/include/ -I/....../jdk1.6.0_26/include/linux/ -L/....../jdk1.6.0_26/jre/lib/i386/server/ -ljvm main.cpp

$./a.out

即可看到程序的输出的结果

运行环境:uBuntu 10.04
分享到:
评论

相关推荐

    使用C++创建java虚拟机JVM,使用JNI调用java函数.zip

    在提供的资源"使用C++创建java虚拟机JVM,使用JNI调用java函数"中,可能详细介绍了以上步骤的实际应用,包括代码示例和可能遇到的问题及解决方案。通过学习和实践这个教程,开发者可以更好地理解和掌握C++与Java之间...

    JNI攻略之十一――启动虚拟机调用java类

    - **调用Java方法**:使用`CallStaticVoidMethod`函数调用Java类的静态方法。 - **清理资源**:在所有操作完成后,使用`DestroyJavaVM`销毁Java虚拟机实例。 #### 3. 执行结果 在成功执行上述过程后,Java虚拟机将...

    在C或C++中调用JAVA方法

    总的来说,通过JNI,开发者可以在C/C++代码中无缝地调用Java方法,实现两者的深度融合。然而,这种方式增加了程序的复杂性,同时也可能引入潜在的内存泄漏和线程安全问题,因此在使用时需要谨慎并做好充分的测试。

    C++调用java jar包测试代码

    - JNI定义了一套函数,使得C/C++可以创建Java对象,调用Java方法,处理异常等。 3. **C++代码调用Java jar**: - 在C++工程(例如使用Visual Studio 2013)中,需要包含jni.h头文件,并且链接到Java的本地库。 -...

    实战-C++调用Java函数

    5. **加载和初始化Java虚拟机**:C++程序运行时,需要启动JVM并加载`FunCall_C2Java_Callee.jar`,然后找到并调用Java方法。 6. **调用Java函数**:使用JNI函数,如`CallVoidMethod`、`CallIntMethod`等,调用Java类...

    Android-JNI完整工程,实现c++调用java和java调用c++

    - 通过`JNIEnv`指针,C++可以查找并调用Java对象的方法,访问字段,甚至创建新的Java对象。 8. **构建流程**: - 使用NDK(Native Development Kit)编译C/C++代码,生成.so文件。 - 将.so文件放置在项目的`jni...

    jni.zip_C++ JNI_JNI 调用java_c调用java_jni_jni jdk1

    这包括获取类的ID,创建Java对象,以及调用Java方法。 5. **数据类型转换**: JNI提供了Java和本地类型之间的转换。例如,将Java的`int`转换为C++的`jint`,将Java对象转换为`jobject`等。 6. **异常处理**: ...

    C++库封装JNI接口-实现java调用c++

    这个头文件包含了Java方法的C/C++声明,供C++代码使用。 3. **编写C++代码**:在C++中实现本地方法。引入生成的头文件,并实现其中的方法。例如: ```cpp #include "MyNativeClass.h" JNIEXPORT void JNICALL ...

    Java语言如何调用C++语言编写的本地方法

    一旦本地方法加载进Java虚拟机,就可以像调用普通Java方法一样调用本地方法。Java虚拟机会自动找到本地库中的对应函数并执行。 9.处理Java和本地代码的数据类型转换 需要知道Java数据类型到本地代码数据类型的映射...

    c++调用java工程

    #### 示例:C++调用Java方法 考虑一个简单的示例,其中C++调用一个Java类`WinFile`的`GetFilesFromDir`方法。首先,在Java侧,`WinFile.java`文件中定义了一个`native`方法: ```java public class WinFile { ...

    安卓Android源码——代码调用C++代码和C++代码调用代码.zip

    - 异常处理:C++代码调用Java方法时要注意处理可能抛出的异常。 - 内存管理:C++中需要手动管理内存,而Java由垃圾回收器自动管理,确保避免内存泄漏。 5. **性能优化** - 使用JNI调用C++代码可以提高性能,特别...

    aix下使用c++调用java类(包)

    例如,`FindClass`用于查找Java类,`GetMethodID`用于获取Java方法的ID,`CallObjectMethod`或`CallVoidMethod`等用于实际调用Java方法。 在`C++调用JAVA方法详解.txt`中,可能详细解释了如何编写这些JNI函数,包括...

    3.jni_c++调用java中的方法

    **C++调用Java方法** 1. **加载Java类:** 使用`JNIEnv`指针的`FindClass`方法,传入要查找的Java类的全名(包括包名)。 2. **获取方法ID:** 使用`GetMethodID`,需要提供类的ID、方法的签名以及方法名。方法...

    c++调用jar包

    这将定义C/C++函数原型,这些函数将在C++代码中实现,用于调用Java方法。 2. **编写C++代码**:在生成的头文件中,你可以看到Java方法的本地接口。在C++源文件(如`Interface.cpp`和`MyFunction.cpp`)中实现这些...

    visual studio 2019下C++通过JNI调用JAVA代码

    在本文中,我们将深入探讨如何在Visual Studio 2019环境下使用C++通过Java Native Interface (JNI)来调用Java代码。JNI是Java平台的一部分,它为Java应用程序提供了与本地代码交互的能力,使得开发者可以将Java应用...

    在Qt平台C++和Java代码的交互

    在C++代码中,你需要定义一些函数,这些函数将在Java代码中被调用。为了使Java能够识别这些函数,需要使用JNI的`JNIEXPORT`和` JNICALL`宏来修饰函数声明。例如: ```cpp extern "C" { JNIEXPORT void JNICALL Java...

    C++调用Java参考代码

    在C++代码中,需要将这些类型转换为本地类型,以便正确地调用Java方法和访问字段。 五、注意事项 - 确保C++和Java的编码方式一致,避免乱码问题。 - 在多线程环境中,需要正确管理JNI环境,每个线程都应有自己的...

    DELPHI 7 调用 JAVA 接口

    6. **传递参数和接收结果**:在Delphi中,你可以使用上述函数,传入Java接口名、方法名以及参数,调用Java方法并获取返回值。 ```delphi const ClassName = 'com/example/MyJavaClass'; MethodName = '...

    Android应用源码之代码调用C++代码和C++代码调用代码.zip

    4. **处理异常**:在C++中调用Java方法时,需要检查可能出现的Java异常并适当地处理它们。 在压缩包中的示例代码中,你将看到这些步骤的实际应用,包括如何定义和实现JNI方法,以及如何在C++中调用Java代码。通过...

Global site tag (gtag.js) - Google Analytics