C通过JNI调用JAVA——创建Object数组参数

来源:互联网 发布:淘宝差评打电话 编辑:程序博客网 时间:2024/04/19 17:40

http://wind6266.blog.163.com/blog/static/6710907201112424521713/

C通过JNI调用JAVA——创建Object数组参数  

2011-02-24 14:47:00|  分类:C / C++ |  标签:c  jni  java  newobjectarray  |字号 订阅



#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <string.h>
#include <tchar.h>
#include <direct.h>
#include <jni.h>

jstring jstr(JNIEnv *env,char *s){
        return (*env)->NewStringUTF(env,s);
}

int main()
{
    JavaVMOption options[1];
    JNIEnv *env;
    JavaVM *jvm;
    JavaVMInitArgs vm_args;
    long status;
    jclass cls;
    jclass str_cls;
    jmethodID mid;
    jobjectArray paramArr;
    
    char* class_name="com/example/Caller";

    options[0].optionString = "-Djava.class.path=.";
    vm_args.version = JNI_VERSION_1_6;
    vm_args.nOptions = 1;
    vm_args.options = options;
    vm_args.ignoreUnrecognized = JNI_TRUE;
    
    //return 0;
    
     /* Create the Java VM */
    status = JNI_CreateJavaVM(&jvm, (void**)&env, &vm_args);
    if (status < 0 || status == JNI_ERR) {
        printf("Status of creating Java VM:%d\n",status);
        fprintf(stderr, "Failed to create Java VM!\n");
        exit(1);
    }

    /*Find the class obj*/
    cls = (*env)->FindClass(env, class_name);
    str_cls = (*env)->FindClass(env, "java/lang/String");
    if(cls !=0)
    {
        /* ---------------------------------------------------------- */
        /*Test to invoke a static method*/
        char* static_method_name="call";
        char* static_method_sign="(Ljava/lang/String;[Ljava/lang/String;)I";
    
        /*Get method ID*/
        mid = (*env)->GetStaticMethodID(env, cls, static_method_name, static_method_sign);
        if(mid !=0)
        {  
            /* *********************************
            create a string array
            ***********************************/
            paramArr = (*env)->NewObjectArray(env,3,str_cls,0);
            (*env)->SetObjectArrayElement(env,paramArr,0,jstr(env,"1"));
            (*env)->SetObjectArrayElement(env,paramArr,1,jstr(env,"user"));
            (*env)->SetObjectArrayElement(env,paramArr,2,jstr(env,"user123"));

            
            jint result = (*env)->CallStaticIntMethod(env, cls, mid,jstr(env,"check_password"),paramArr);
            
            printf("Call static method %s: %d\n",static_method_name,result);
        }else{
            printf("Failed to find method %s!\n",static_method_name);
        }
    }else{
        printf("Failed to find Class %s!\n",class_name);
    }
    
    /*destory JVM*/
    (*jvm)->DestroyJavaVM(jvm);
    return 0;
}

原创粉丝点击