在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 所在的目录下编辑的,否则的话总是提醒找不到类定义的错误。