📄 rights_jni.c
字号:
/* 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 + -