2005年代码归档,印象中是VC6+JDK1.2
这里有一个Chinese的java类,之所以起这个名字,应该是为了测试能否传递中文参数。
public class Chinese
{
private static void sayHello(String name){
System.out.println("Hello: " + name);
}
public static void main(String[] args){
for(int idx = 0; idx < args.length; idx ++){
sayHello(args[idx]);
}
}
};
然后我们创建一个C++程序demo.cpp
#include <stdio.h>
#include <jni.h>
#include <jawt_md.h>
int main()
{
JavaVMOption options[1];
JavaVMInitArgs vm_args;
JavaVM *jvm;
JNIEnv *env;
long status;
jclass class_Chinese;
jclass class_String;
jobjectArray args;
jmethodID id_main;
//options[0].optionString = "-Djava.class.path=.";
memset(&vm_args, 0, sizeof(vm_args));
vm_args.version = JNI_VERSION_1_2;
//vm_args.nOptions = 1;
//vm_args.options = options;
status = JNI_CreateJavaVM(&jvm, (void**)&env, &vm_args);
if (status == JNI_ERR)
{
printf("Error creating VM\n");
return 1;
}
class_Chinese = (*env).FindClass("Chinese");
id_main = (*env).GetStaticMethodID(class_Chinese, "main", "([Ljava/lang/String;)V");
class_String = (*env).FindClass("java/lang/String");
// Call main(String[]{""Rookie.张[中文]"})
args = (*env).NewObjectArray(2, class_String, (*env).NewStringUTF("Rookie.Zhang"));
(*env).SetObjectArrayElement(args, 1, (*env).NewStringUTF("Leechee.Lee"));
(*env).CallStaticVoidMethod(class_Chinese, id_main, args);
(*jvm).DestroyJavaVM();
return 0;
}