在 C/C++ 中调用 Java
这两天研究了一下在 C/C++ 中怎么来调用 Java 程序。以前知道 JNI(Java Native
Interface),知道在 Java 中怎么来调用 C/C++ 的库,但是反过来还没仔细研究过。
其实反过来想一下,Java 本身是跨平台的,靠的是 JVM(Java Virtual Machine),
那 JVM 是谁来实现的呢?自然是 JVM 的提供者,SUN 自己的就不用说了,其他的实
现还有 [IBM]、[Kaffe],在 [Wikipeida] 上列出了一堆的实现。这些 JVM 的实现大多
是 C/C++ 实现的,那从 C/C++ 中调用 Java 应该问题不大,而所用的工具仍然是
JNI。[这里]列出了一些有用的链接。
总的来说,从 C/C++ 中调用 Java 代码,有一下几个步骤:
1. 创建 JVM。调用 JNI_CreateJavaVM()。
2. 寻找要调用的类。调用 FindClass()。
3. 找到要调用的方法。调用 GetStaticMethodID()/GetMethodID()。
4. 运行方法。调用 CallStaticMethod()/CallMethod()。
5. 退出 JVM。调用 DestroyJavaVM()。
jvm.c 模拟了 JDK 中自带的 java 命令,其调用格式如下:jvm [-classpath
classpath] class [args],如果指定了 -classpath 参数,则以此作为类路径,如果
没有,则使用 CLASSPATH 环境变量。代码如下:
jvm.c
1 #include <jni.h>
2
3 #include <stdlib.h>
4 #include <stdio.h>
5
6 int main(int argc, char*argv[]) {
7
8 JavaVM *jvm;
9 JNIEnv *env;
10 JavaVMInitArgs vm_args;
11 JavaVMOption options[1];
12
13 jobjectArray applicationArgs;
14 jstring appArg;
15
16 /*