linux: C++ create JVM to invoke Java method
来源:互联网 发布:淘宝客服发展前景 编辑:程序博客网 时间:2024/06/05 06:41
在C++代码中创建虚拟机直接调用java自身的类较为简单,见C++ 代码创建虚拟机调用java方法,调用自身定义的java类中的方法稍微有些不同,以下代码为C++本地化方法中创建虚拟机然后调用java函数的方法示例。
文件结构图如下:
jhh@jhh:~/practise/invokde_jni$ ls
a.out main.cpp myworkspacepackage
jhh@jhh:~/practise/invokde_jni$ tree .
.
|-- a.out
|-- main.cpp
`-- myworkspacepackage
|-- HelloWorld.class
`-- HelloWorld.java
创建myworkspacepackage目录,进入到myworkspacepackage编辑HelloWorld.java文件
HelloWorld.java
package myworkspacepackage;public class HelloWorld{ public HelloWorld(){ } static public void sayHello(){ System.out.println("----sayHello method from HelloWorld class-----"); } }
编译HelloWorld.java文件
$ javac HelloWorld.java
生成HelloWorld.class 文件
退出到上一级目录编辑main.cpp 文件
#include <jni.h>#include <stdio.h>#include <stdlib.h>int main(int argc,char **argv){ JNIEnv *env; JavaVM *jvm; jint res; jclass cls; jmethodID mid; jstring jstr; jclass stringClass; jobjectArray args; char optionString[] = "-Djava.class.path=."; JavaVMInitArgs vm_args; JavaVMOption options[1]; options[0].optionString = optionString; // "-Djava.class.path=."; // or "-Djava.class.path=/home/jhh/practise/invokde_jni/"; //OK /* options[1].optionString = "-verbose"; options[2].optionString = "-verbose:jni"; */ vm_args.version = JNI_VERSION_1_6; vm_args.options = options; vm_args.nOptions = 1; vm_args.ignoreUnrecognized = JNI_FALSE; /* Create the Java VM */ res = JNI_CreateJavaVM(&jvm, (void**)&env, &vm_args); if (res < 0) { fprintf(stderr, "Can't create Java VM\n"); exit(1); } if ((env)->ExceptionOccurred()) { (env)->ExceptionDescribe(); } cls = (env)->FindClass("myworkspacepackage/HelloWorld"); if (cls == NULL) { if ((env)->ExceptionOccurred()) { (env)->ExceptionDescribe(); } printf("Failed to get class\n"); exit(1); } printf("-----in main.cpp, will get printJavaHelloWorld method to call------\n"); jmethodID staticMethodID = env->GetStaticMethodID(cls, "sayHello", "()V"); env->CallStaticVoidMethod(cls, staticMethodID); (jvm)->DestroyJavaVM();}编译
$pwd
/home/jhh/practise/invokde_jni
$ export LD_LIBRARY_PATH=/sziauto/android_develop/tools/jdk1.6.0_26/jre/lib/i386/server/
$ 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
即可看到打印结果
-----in main.cpp, will get printJavaHelloWorld method to call------
----sayHello method from HelloWorld class-----
运行环境:ubuntu 10.04
注:编译的时候是在main.cpp 所在的目录下编辑的,否则的话总是提醒找不到类定义的错误。
- linux: C++ create JVM to invoke Java method
- How to Create a JAVA Native Method
- java method invoke
- java.lang.NullPointerException: Attempt to invoke virtual method
- Attempt to invoke virtual method 'int java.lang.Integer.intValue()
- java class.forname method.invoke
- java Method invoke 参数问题
- java.lang.RuntimeException: invoke method
- java反射机制学习笔记与Method类invoke方法jvm底层优化方案
- one method to create dump
- P/Invoke to create ODBC system DSN
- java.lang.NullPointerException: Attempt to invoke virtual method 'int java.lang.Integer.intValue()'
- Attempt to invoke interface method 'java.lang.Object[] java.util.Collection.toArray()' on a null obj
- java.lang.NullPointerException: Attempt to invoke virtual method 'int java.io.InputStream.read(byte[
- java.lang.NullPointerException: Attempt to invoke virtual method 'void java.io.BufferedOutputStream.
- Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'boolean java.lang.Str
- Attempt to invoke interface method 'boolean java.util.List.add(java.lang.Object)' on a null
- 解决Attempt to invoke virtual method'boolean java.lang.String.equals(java.lang.Object)'...
- python资料汇总
- TCP/IP详解基于4.4BSD-Lite源码
- ruby +watir +cucumber 安装
- Android OpenGL ES 2.0画立方体JNI实现
- 正在设定sun-java6-jre解决方法
- linux: C++ create JVM to invoke Java method
- 浅析StackTrace
- CentOS 5.X 安装 GForge ,安装 postgresql (gforge安装)
- 程序设计师真情忏悔录
- sina sdk 返回来的结果(给自己看的!)
- C#调用Win32 的API函数--User32.dll
- UVa216
- POJ 2516(最小费用最大流)
- XE2 日期字符串转日期的函数