C++ 代码创建虚拟机调用java方法
2012-08-17 16:55
786 查看
Java 和 C/C++代码的互相调用一般都是采用JNI的方法,首先Java 类 J 通过native函数调用在 对应的C++文件C中的方法,C文件保存相应的虚拟机和JNIEnv等变量,获取java类中的方法或者属性的ID,进而回调J中的方法。但有时候需要直接从C++的方法中调用java的方法,这就需要在C++代码中创建虚拟机,从而直接调用java中的代码。
代码如下:(main.cpp)
编译如下:
$ 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
调用自定义类中的方法的例子见 linux: cpp create JVM to invoke Java method
代码如下:(main.cpp)
#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
调用自定义类中的方法的例子见 linux: cpp create JVM to invoke Java method
相关文章推荐
- Java 动态的创建注入代码,注入方法给类或者接口并通过反射调用
- C/C++调用Java代码(属性和方法)
- 有关非Java代码(即Java调用C++中自然方法)的问题
- 在java中调用c/c++代码的方法(jni)
- Android-NDK开发之基础--Android JNI实例代码(一)-- 在JNI中执行Java方法--C/C++调用Java
- 入门: 使用JNI 从C++代码中调用Java的静态方法
- 在java中调用c/c++代码的方法(jni)
- C/C++调用Java代码(属性和方法)
- JNI学习笔记:(1)开篇(2)本地代码访问Java代码 (3)本地方法取得Java属性/调用java方法 (4)本地代码创建Java对象(包括javaString) (5) 本地方法处理java数组
- 关于C++调用jar包,在创建虚拟机时使用JNI_CreateJavaVM调用失败返回-1的问题
- 在java中调用c/c++代码的方法(jni)
- 用Swig将c/c++程序转为java代码(使用swig实现java调用c、c++的方法)
- Android-NDK开发之基础--Android JNI实例代码(一)-- 在JNI中执行Java方法--C/C++调用Java
- 调用外部DLL,如:DelphiC++Java的DLL的调用方法,给出代码片段?
- C++创建虚拟机调用JAVA类
- Android-NDK开发之基础--Android JNI实例代码(一)-- 在JNI中执行Java方法--C/C++调用Java
- Android JNI 使用的数据结构JNINativeMethod详解 ||建立Android SDK下的JNI、JAVA应用完整步骤---Android JAVA调用C++代码
- JNI NDK (AndroidStudio+CMake )实现C C++调用Java代码流程
- Java调用C/C++ API 讲解及代码示例
- C++调用JAVA方法详解_____转载自http://public0821.iteye.com/blog/423941