C++调用Java

77 阅读1分钟

2005年代码归档,印象中是VC6+JDK1.2

这里有一个Chinese的java类,之所以起这个名字,应该是为了测试能否传递中文参数。

{
        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;
}