124 lines
2.8 KiB
C
124 lines
2.8 KiB
C
|
/*
|
||
|
* BindingsUtil.c
|
||
|
*
|
||
|
* Copyright (c) 2007 Vreixo Formoso
|
||
|
*
|
||
|
* This library is free software; you can redistribute it and/or modify
|
||
|
* it under the terms of the GNU General Public License as published by
|
||
|
* the Free Software Foundation; either version 2 of the License, or
|
||
|
* (at your option) any later version.
|
||
|
* See COPYING file for details.
|
||
|
*/
|
||
|
|
||
|
#include "BindingsUtil.h"
|
||
|
|
||
|
#define JAVA_LIBBURN_JNI_VERSION JNI_VERSION_1_4
|
||
|
|
||
|
static JavaVM* cachedJavaVM;
|
||
|
|
||
|
JNIEXPORT jint JNICALL
|
||
|
JNI_OnLoad
|
||
|
(
|
||
|
JavaVM *jvm,
|
||
|
void *reserved
|
||
|
)
|
||
|
{
|
||
|
if (jvm == NULL) {
|
||
|
perror("null JavaVM pointer");
|
||
|
}
|
||
|
cachedJavaVM = jvm;
|
||
|
return JAVA_LIBBURN_JNI_VERSION;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Creates a new TocEntry java class from a burn_toc_entry C struct
|
||
|
*/
|
||
|
jobject java_libburn_toc_entry_c2java
|
||
|
(
|
||
|
JNIEnv *env, struct burn_toc_entry *entry
|
||
|
)
|
||
|
{
|
||
|
static jclass tocEntryCls = NULL;
|
||
|
static jmethodID cid = NULL;
|
||
|
jobject result;
|
||
|
|
||
|
if ( tocEntryCls == NULL ) {
|
||
|
tocEntryCls = (*env)->FindClass(env, "org/pykix/libburnia/libburn/TocEntry");
|
||
|
if ( tocEntryCls == NULL ) {
|
||
|
return NULL;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if ( cid == NULL ) {
|
||
|
cid = (*env)->GetMethodID(env, tocEntryCls, "<init>", "(BBBBBBBBBBBBBBBII)V");
|
||
|
if (cid == NULL) {
|
||
|
return NULL; /* exception thrown */
|
||
|
}
|
||
|
}
|
||
|
|
||
|
result = (*env)->NewObject(env, tocEntryCls, cid, entry->session, entry->adr, entry->control,
|
||
|
entry->tno, entry->point, entry->min, entry->sec, entry->frame, entry->zero, entry->pmin,
|
||
|
entry->psec, entry->pframe, entry->extensions_valid, entry->session_msb,
|
||
|
entry->point_msb, entry->start_lba, entry->track_blocks);
|
||
|
|
||
|
return result;
|
||
|
}
|
||
|
|
||
|
|
||
|
void java_libburn_throw_burn_exception
|
||
|
(
|
||
|
JNIEnv *env, const char *msg
|
||
|
)
|
||
|
{
|
||
|
static jclass cls = NULL;
|
||
|
|
||
|
if ( cls == NULL) {
|
||
|
cls = (*env)->FindClass(env, "org/pykix/libburnia/libburn/BurnException");
|
||
|
}
|
||
|
(*env)->ThrowNew(env, cls, msg);
|
||
|
}
|
||
|
|
||
|
jclass java_libburn_find_class
|
||
|
(
|
||
|
JNIEnv *env, const char *name
|
||
|
)
|
||
|
{
|
||
|
jclass localRefCls = (*env)->FindClass(env, name);
|
||
|
if (localRefCls == NULL) {
|
||
|
return NULL; /* exception thrown */
|
||
|
}
|
||
|
|
||
|
jclass globalRef = (*env)->NewWeakGlobalRef(env, localRefCls);
|
||
|
|
||
|
(*env)->DeleteLocalRef(env, localRefCls);
|
||
|
|
||
|
return globalRef; //can be NULL on error, need to be checked!!
|
||
|
}
|
||
|
|
||
|
JNIEnv* java_libburn_get_env()
|
||
|
{
|
||
|
JNIEnv* env;
|
||
|
jint result;
|
||
|
|
||
|
result = (*cachedJavaVM)->GetEnv(cachedJavaVM, (void **) &env, JAVA_LIBBURN_JNI_VERSION);
|
||
|
if ( result != JNI_OK) {
|
||
|
switch (result) {
|
||
|
case JNI_EDETACHED:
|
||
|
perror("[DEBUG] Current thread is not attached. Attaching...");
|
||
|
|
||
|
JavaVMAttachArgs args;
|
||
|
args.version = JAVA_LIBBURN_JNI_VERSION;
|
||
|
args.name = "Signal handler callback";
|
||
|
args.group = NULL;
|
||
|
(*cachedJavaVM)->AttachCurrentThread(cachedJavaVM, (void **)&env, &args);
|
||
|
return env;
|
||
|
break;
|
||
|
case JNI_EVERSION:
|
||
|
g_error("Specified version is not supported.");
|
||
|
break;
|
||
|
}
|
||
|
return NULL;
|
||
|
}
|
||
|
return env;
|
||
|
}
|