C通過JNI調用JAVA——創建Object數組參數

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

發佈了17 篇原創文章 · 獲贊 4 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章