⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rights_jni.c

📁 Sun公司Dream项目
💻 C
📖 第 1 页 / 共 2 页
字号:
    /* Create the Java VM */
    res = JNI_CreateJavaVM(&(jni_data->jvm), (void**)&(jni_data->env), &vm_args);

    free(options[0].optionString);
    free(options[1].optionString);
    /* free( user_classpath ); */

    if (res < 0) {
        fprintf(stderr, "Can't create Java VM\n");
        clearRefs( jni_data );
        free( jni_data );
        return NULL;
    }

    /* create and cache global to rights_class */
    jclass lcls1 = (*(jni_data->env))->FindClass( jni_data->env,
                                                  RIGHTS_CLASS_NAME
                                                 );
    jni_data->rights_class = (*(jni_data->env))->NewGlobalRef( jni_data->env, lcls1 );
    if ( jni_data->rights_class == NULL ) {
        checkException( jni_data->env );
    }
    (*(jni_data->env))->DeleteLocalRef( jni_data->env, lcls1 );
    
    /* creating global reference to rights manager */ 
    jobject lobj = createNewJNIObject( jni_data->env, NULL, jni_data->rights_class );
    jni_data->rights_mgr = (*(jni_data->env))->NewGlobalRef( jni_data->env, lobj );
    /* Since createNewJNIObject returns an object with a weak global ref */
    (*(jni_data->env))->DeleteWeakGlobalRef( jni_data->env, lobj );


    /* create and cache global to action stat class */
    jclass lcls2 = (*(jni_data->env))->FindClass( jni_data->env,
                                                  ACTION_STAT_CLASS_NAME
                                                 );
    jni_data->action_stat_class = (*(jni_data->env))->NewGlobalRef( jni_data->env, lcls2 );
    if ( jni_data->action_stat_class == NULL ) {
        checkException( jni_data->env );
    }
    (*(jni_data->env))->DeleteLocalRef( jni_data->env, lcls2 );
   
    /* create and cache global to string class XXX Is this needed? XXX */
    jclass lcls3 = (*(jni_data->env))->FindClass( jni_data->env,
                                                  STRING_CLASS_NAME );
    jni_data->string_class = (*(jni_data->env))->NewGlobalRef( jni_data->env, lcls3 );
    if ( jni_data->string_class == NULL ) {
        checkException( jni_data->env );
    }
    (*(jni_data->env))->DeleteLocalRef( jni_data->env, lcls3 );

#ifdef _DEBUG
fprintf( stderr, "\n%s:%d::jni_data = %p jvm = %p env = %p rights_class = %p rights_obj = %p action_stat = %p, string class = %p", 
      __FILE__, __LINE__, jni_data, jni_data->jvm, jni_data->env,
      jni_data->rights_class, jni_data->rights_mgr, jni_data->action_stat_class, jni_data->string_class );
#endif /* _DEBUG */
    
    return jni_data;
}

/* 
 * loads jni env. should be called for every call from a new native thread 
 */
static int loadJNIEnv( JNIData *jni_data )
{
    jint ret;
    ret = (*(jni_data->jvm))->AttachCurrentThread( jni_data->jvm, 
                                                    (void **)&(jni_data->env), 
                                                    NULL ); 
    if ( ret < 0 ) {
        fprintf( stderr, "\nCan't get env from jvm" );
        jni_data->env = NULL;
    }

#ifdef _DEBUG
fprintf( stderr, "\n%s:%d::loadJNIEnv ret %d jvm %p", __FILE__, __LINE__, ret,
jni_data->env );
fflush(stderr);
#endif /* _DEBUG */
    
    return ret;
}

/*
 * client/driver is preparing to play media. This function will prepare keys.
 */
void jniPrepareKeys( void *xface_data, char * media_url, int action_id )
{
    JNIData *jni_data = (JNIData *)(xface_data);

    loadJNIEnv( jni_data );

    JNIEnv *env = jni_data->env;
    jobject rights_mgr = jni_data->rights_mgr; 
    

    jstring media_str = (*env)->NewStringUTF( env, (const char*) media_url );
    jmethodID mid = (*env)->GetMethodID( env, jni_data->rights_class,
                            PREPARE_KEYS, PREPARE_KEYS_SIG );

    if( mid == NULL ) {
        checkException( env );
        fprintf( stderr, "\nError getting method id for prepare keys");
        return;
    }
    
    (*env)->CallVoidMethod( env, rights_mgr, mid, (jint)action_id, media_str );

    if( checkException( env ) ) {
        fprintf( stderr, "Fatal exception jniCheckRights: PrepareKeys failed\n" );
        return;
    }
}


void jniReleaseRights( void *xface_data, char* media_url )
{
    unsigned char * keys;
    JNIData *jni_data = (JNIData *)(xface_data);

    loadJNIEnv( jni_data ); 
    
    JNIEnv *env = jni_data->env;
    jobject rights_mgr = jni_data->rights_mgr; 
    
    jstring media_str = (*env)->NewStringUTF( env, (const char*) media_url); 
    
    jmethodID mid = (*env)->GetMethodID( env, jni_data->rights_class, RELEASE_RIGHTS, RELEASE_RIGHTS_SIG );

    if ( mid == NULL ) {
        checkException( env );
        fprintf( stderr, "\ncreateNewJNIObject: no simple constructor found"); 
        return;
    }

    (*env)->CallVoidMethod( env, rights_mgr, mid, media_str );
    
    return;
}

/*
 * takes actionstat and converts it into a java object
 */
static jobject prepareActionStat( JNIData *jni_data, ActionStat *stat ) {
    
    /* Create an action stat object and populate it with various fields from the
     * native version of the action stat */
    jobject stat_obj = createNewJNIObject( jni_data->env,
                                              NULL, jni_data->action_stat_class );

    /* TODO set individual fields of the jActionStat. For now it does not really
     * matter. I am only setting the num field */
     jfieldID  fid = (*(jni_data->env))->GetFieldID(jni_data->env, jni_data->action_stat_class, "num", "I");
     
     (*(jni_data->env))->SetIntField(jni_data->env, stat_obj, fid, stat->cnt);

     return stat_obj;
}

/**
 * Reports usage 
 */
void jniReportUsage( void *xface_data, ActionId id, char *media_url )
{
    JNIData *jni_data = (JNIData *)(xface_data);   

    loadJNIEnv( jni_data );

    JNIEnv *env = jni_data->env;
    jobject rights_mgr = jni_data->rights_mgr;

    jstring media_str = (*env)->NewStringUTF( env, (const char*) media_url); 
    jmethodID mid = (*env)->GetMethodID( env, jni_data->rights_class, REPORT_USAGE, REPORT_USAGE_SIG );
    if ( mid == NULL ) {
        checkException( env );
        fprintf( stderr, "\njniReportUsage: no reportUsage method not found"); 
        return;
    }
    
    (*env)->CallVoidMethod( env, rights_mgr, mid, (jint)id, media_str );

    if( checkException( env ) ) {
        fprintf( stderr, "Fatal exception jniReportUsage: checkAction failed\n" );
    }

}

unsigned char jniCheckRights( void *xface_data, ActionId id, char * media_url, ActionStat *stat )
{
    unsigned char * keys;
    JNIData *jni_data = (JNIData *)(xface_data);

    loadJNIEnv( jni_data ); 
    
    JNIEnv *env = jni_data->env;
    jobject rights_mgr = jni_data->rights_mgr; 

    /* convert it into a java object */
    jobject stat_obj = prepareActionStat( jni_data, stat );

    jstring media_str = (*env)->NewStringUTF( env, (const char*) media_url); 
    
    jmethodID mid = (*env)->GetMethodID( env, jni_data->rights_class, CHECK_ACTION, CHECK_ACTION_SIG );

    if ( mid == NULL ) {
        checkException( env );
        fprintf( stderr, "\ncreateNewJNIObject: no simple constructor found"); 
        return 0;
    }

    jboolean retval = (*env)->CallBooleanMethod( env, rights_mgr, mid,
                                                  (jint)id, media_str, stat_obj );
    if( checkException( env ) ) {
        fprintf( stderr, "Fatal exception jniCheckRights: checkAction failed\n" );
        retval = 0;
    }

    /* if everything is done, lets be prudent and delete the weak global */
    (*env)->DeleteWeakGlobalRef( env, stat_obj );

    /* If there was no exception then we look for keys */
    /*
    jfieldID fid = env->GetFieldID( jni_data->action_stat_class, "keys", "[B" )
    jbyteArray * jba = (jbyteArray *)(*env)->GetObjectField( stat_obj, fid );
    
    jsize size = (*env)->GetArrayLength( env, jba ); 
    jbyte *bytes = (*env)->GetByteArrayElements( env, jba, NULL); 
    */
     
    return (unsigned char)retval;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -