Fix JNI Code Style

This commit is contained in:
Florian Märkl 2019-09-15 15:02:01 +02:00
commit 251a270277
No known key found for this signature in database
GPG key ID: 125BC8A5A6A1E857

View file

@ -13,44 +13,44 @@
static void log_cb_android(ChiakiLogLevel level, const char *msg, void *user) static void log_cb_android(ChiakiLogLevel level, const char *msg, void *user)
{ {
int prio; int prio;
switch(level) switch(level)
{ {
case CHIAKI_LOG_DEBUG: case CHIAKI_LOG_DEBUG:
prio = ANDROID_LOG_DEBUG; prio = ANDROID_LOG_DEBUG;
break; break;
case CHIAKI_LOG_VERBOSE: case CHIAKI_LOG_VERBOSE:
prio = ANDROID_LOG_VERBOSE; prio = ANDROID_LOG_VERBOSE;
break; break;
case CHIAKI_LOG_INFO: case CHIAKI_LOG_INFO:
prio = ANDROID_LOG_INFO; prio = ANDROID_LOG_INFO;
break; break;
case CHIAKI_LOG_WARNING: case CHIAKI_LOG_WARNING:
prio = ANDROID_LOG_ERROR; prio = ANDROID_LOG_ERROR;
break; break;
case CHIAKI_LOG_ERROR: case CHIAKI_LOG_ERROR:
prio = ANDROID_LOG_ERROR; prio = ANDROID_LOG_ERROR;
break; break;
default: default:
prio = ANDROID_LOG_INFO; prio = ANDROID_LOG_INFO;
break; break;
} }
__android_log_write(prio, LOG_TAG, msg); __android_log_write(prio, LOG_TAG, msg);
} }
static char *strdup_jni(const char *str) static char *strdup_jni(const char *str)
{ {
if(!str) if(!str)
return NULL; return NULL;
char *r = strdup(str); char *r = strdup(str);
if(!r) if(!r)
return NULL; return NULL;
for(char *c=r; *c; c++) for(char *c=r; *c; c++)
{ {
if(*c & (1 << 7)) if(*c & (1 << 7))
*c = '?'; *c = '?';
} }
return r; return r;
} }
static ChiakiLog global_log; static ChiakiLog global_log;
@ -58,183 +58,183 @@ static JavaVM *global_vm;
JNIEXPORT jint JNI_OnLoad(JavaVM *vm, void *reserved) JNIEXPORT jint JNI_OnLoad(JavaVM *vm, void *reserved)
{ {
global_vm = vm; global_vm = vm;
chiaki_log_init(&global_log, CHIAKI_LOG_ALL & ~CHIAKI_LOG_VERBOSE, log_cb_android, NULL); chiaki_log_init(&global_log, CHIAKI_LOG_ALL & ~CHIAKI_LOG_VERBOSE, log_cb_android, NULL);
CHIAKI_LOGI(&global_log, "Loading Chiaki Library"); CHIAKI_LOGI(&global_log, "Loading Chiaki Library");
ChiakiErrorCode err = chiaki_lib_init(); ChiakiErrorCode err = chiaki_lib_init();
CHIAKI_LOGI(&global_log, "Chiaki Library Init Result: %s\n", chiaki_error_string(err)); CHIAKI_LOGI(&global_log, "Chiaki Library Init Result: %s\n", chiaki_error_string(err));
return JNI_VERSION; return JNI_VERSION;
} }
#define E (*env) #define E (*env)
JNIEXPORT jstring JNICALL Java_com_metallic_chiaki_lib_ChiakiNative_errorCodeToString(JNIEnv *env, jobject obj, jint value) JNIEXPORT jstring JNICALL Java_com_metallic_chiaki_lib_ChiakiNative_errorCodeToString(JNIEnv *env, jobject obj, jint value)
{ {
return E->NewStringUTF(env, chiaki_error_string((ChiakiErrorCode)value)); return E->NewStringUTF(env, chiaki_error_string((ChiakiErrorCode)value));
} }
JNIEXPORT jstring JNICALL Java_com_metallic_chiaki_lib_ChiakiNative_quitReasonToString(JNIEnv *env, jobject obj, jint value) JNIEXPORT jstring JNICALL Java_com_metallic_chiaki_lib_ChiakiNative_quitReasonToString(JNIEnv *env, jobject obj, jint value)
{ {
return E->NewStringUTF(env, chiaki_quit_reason_string((ChiakiQuitReason)value)); return E->NewStringUTF(env, chiaki_quit_reason_string((ChiakiQuitReason)value));
} }
typedef struct android_chiaki_session_t typedef struct android_chiaki_session_t
{ {
ChiakiSession session; ChiakiSession session;
jobject java_session; jobject java_session;
jclass java_session_class; jclass java_session_class;
jmethodID java_session_event_login_pin_request_meth; jmethodID java_session_event_login_pin_request_meth;
jmethodID java_session_event_quit_meth; jmethodID java_session_event_quit_meth;
} AndroidChiakiSession; } AndroidChiakiSession;
static JNIEnv *attach_thread_jni() static JNIEnv *attach_thread_jni()
{ {
JNIEnv *env; JNIEnv *env;
int r = (*global_vm)->GetEnv(global_vm, (void **)&env, JNI_VERSION); int r = (*global_vm)->GetEnv(global_vm, (void **)&env, JNI_VERSION);
if(r == JNI_OK) if(r == JNI_OK)
return env; return env;
if((*global_vm)->AttachCurrentThread(global_vm, &env, NULL) == 0) if((*global_vm)->AttachCurrentThread(global_vm, &env, NULL) == 0)
return env; return env;
CHIAKI_LOGE(&global_log, "Failed to get JNIEnv from JavaVM or attach"); CHIAKI_LOGE(&global_log, "Failed to get JNIEnv from JavaVM or attach");
} }
static void android_chiaki_event_cb(ChiakiEvent *event, void *user) static void android_chiaki_event_cb(ChiakiEvent *event, void *user)
{ {
AndroidChiakiSession *session = user; AndroidChiakiSession *session = user;
JNIEnv *env = attach_thread_jni(); JNIEnv *env = attach_thread_jni();
if(!env) if(!env)
return; return;
switch(event->type) switch(event->type)
{ {
case CHIAKI_EVENT_LOGIN_PIN_REQUEST: case CHIAKI_EVENT_LOGIN_PIN_REQUEST:
E->CallVoidMethod(env, session->java_session, E->CallVoidMethod(env, session->java_session,
session->java_session_event_login_pin_request_meth, session->java_session_event_login_pin_request_meth,
(jboolean)event->login_pin_request.pin_incorrect); (jboolean)event->login_pin_request.pin_incorrect);
break; break;
case CHIAKI_EVENT_QUIT: case CHIAKI_EVENT_QUIT:
{ {
char *reason_str = strdup_jni(event->quit.reason_str); char *reason_str = strdup_jni(event->quit.reason_str);
jstring reason_str_java = E->NewStringUTF(env, reason_str ? reason_str : ""); jstring reason_str_java = E->NewStringUTF(env, reason_str ? reason_str : "");
E->CallVoidMethod(env, session->java_session, E->CallVoidMethod(env, session->java_session,
session->java_session_event_quit_meth, session->java_session_event_quit_meth,
(jint)event->quit.reason, (jint)event->quit.reason,
reason_str_java); reason_str_java);
E->DeleteLocalRef(env, reason_str_java); E->DeleteLocalRef(env, reason_str_java);
free(reason_str); free(reason_str);
break; break;
} }
} }
(*global_vm)->DetachCurrentThread(global_vm); (*global_vm)->DetachCurrentThread(global_vm);
} }
JNIEXPORT void JNICALL Java_com_metallic_chiaki_lib_ChiakiNative_sessionCreate(JNIEnv *env, jobject obj, jobject result, jobject connect_info_obj, jobject java_session) JNIEXPORT void JNICALL Java_com_metallic_chiaki_lib_ChiakiNative_sessionCreate(JNIEnv *env, jobject obj, jobject result, jobject connect_info_obj, jobject java_session)
{ {
AndroidChiakiSession *session = NULL; AndroidChiakiSession *session = NULL;
ChiakiErrorCode err = CHIAKI_ERR_SUCCESS; ChiakiErrorCode err = CHIAKI_ERR_SUCCESS;
char *host_str = NULL; char *host_str = NULL;
jclass result_class = E->GetObjectClass(env, result); jclass result_class = E->GetObjectClass(env, result);
jclass connect_info_class = E->GetObjectClass(env, connect_info_obj); jclass connect_info_class = E->GetObjectClass(env, connect_info_obj);
jstring host_string = E->GetObjectField(env, connect_info_obj, E->GetFieldID(env, connect_info_class, "host", "Ljava/lang/String;")); jstring host_string = E->GetObjectField(env, connect_info_obj, E->GetFieldID(env, connect_info_class, "host", "Ljava/lang/String;"));
jbyteArray regist_key_array = E->GetObjectField(env, connect_info_obj, E->GetFieldID(env, connect_info_class, "registKey", "[B")); jbyteArray regist_key_array = E->GetObjectField(env, connect_info_obj, E->GetFieldID(env, connect_info_class, "registKey", "[B"));
jbyteArray morning_array = E->GetObjectField(env, connect_info_obj, E->GetFieldID(env, connect_info_class, "morning", "[B")); jbyteArray morning_array = E->GetObjectField(env, connect_info_obj, E->GetFieldID(env, connect_info_class, "morning", "[B"));
jobject connect_video_profile_obj = E->GetObjectField(env, connect_info_obj, E->GetFieldID(env, connect_info_class, "videoProfile", "Lcom/metallic/chiaki/lib/ConnectVideoProfile;")); jobject connect_video_profile_obj = E->GetObjectField(env, connect_info_obj, E->GetFieldID(env, connect_info_class, "videoProfile", "Lcom/metallic/chiaki/lib/ConnectVideoProfile;"));
jclass connect_video_profile_class = E->GetObjectClass(env, connect_video_profile_obj); jclass connect_video_profile_class = E->GetObjectClass(env, connect_video_profile_obj);
ChiakiConnectInfo connect_info; ChiakiConnectInfo connect_info;
const char *str_borrow = E->GetStringUTFChars(env, host_string, NULL); const char *str_borrow = E->GetStringUTFChars(env, host_string, NULL);
connect_info.host = host_str = strdup(str_borrow); connect_info.host = host_str = strdup(str_borrow);
E->ReleaseStringUTFChars(env, host_string, str_borrow); E->ReleaseStringUTFChars(env, host_string, str_borrow);
if(!connect_info.host) if(!connect_info.host)
{ {
err = CHIAKI_ERR_MEMORY; err = CHIAKI_ERR_MEMORY;
goto beach; goto beach;
} }
if(E->GetArrayLength(env, regist_key_array) != sizeof(connect_info.regist_key)) if(E->GetArrayLength(env, regist_key_array) != sizeof(connect_info.regist_key))
{ {
CHIAKI_LOGE(&global_log, "Regist Key passed from Java has invalid length"); CHIAKI_LOGE(&global_log, "Regist Key passed from Java has invalid length");
err = CHIAKI_ERR_INVALID_DATA; err = CHIAKI_ERR_INVALID_DATA;
goto beach; goto beach;
} }
jbyte *bytes = E->GetByteArrayElements(env, regist_key_array, NULL); jbyte *bytes = E->GetByteArrayElements(env, regist_key_array, NULL);
memcpy(connect_info.regist_key, bytes, sizeof(connect_info.regist_key)); memcpy(connect_info.regist_key, bytes, sizeof(connect_info.regist_key));
E->ReleaseByteArrayElements(env, regist_key_array, bytes, JNI_ABORT); E->ReleaseByteArrayElements(env, regist_key_array, bytes, JNI_ABORT);
if(E->GetArrayLength(env, morning_array) != sizeof(connect_info.morning)) if(E->GetArrayLength(env, morning_array) != sizeof(connect_info.morning))
{ {
CHIAKI_LOGE(&global_log, "Morning passed from Java has invalid length"); CHIAKI_LOGE(&global_log, "Morning passed from Java has invalid length");
err = CHIAKI_ERR_INVALID_DATA; err = CHIAKI_ERR_INVALID_DATA;
goto beach; goto beach;
} }
bytes = E->GetByteArrayElements(env, morning_array, NULL); bytes = E->GetByteArrayElements(env, morning_array, NULL);
memcpy(connect_info.morning, bytes, sizeof(connect_info.morning)); memcpy(connect_info.morning, bytes, sizeof(connect_info.morning));
E->ReleaseByteArrayElements(env, morning_array, bytes, JNI_ABORT); E->ReleaseByteArrayElements(env, morning_array, bytes, JNI_ABORT);
connect_info.video_profile.width = (unsigned int)E->GetIntField(env, connect_video_profile_obj, E->GetFieldID(env, connect_video_profile_class, "width", "I")); connect_info.video_profile.width = (unsigned int)E->GetIntField(env, connect_video_profile_obj, E->GetFieldID(env, connect_video_profile_class, "width", "I"));
connect_info.video_profile.height = (unsigned int)E->GetIntField(env, connect_video_profile_obj, E->GetFieldID(env, connect_video_profile_class, "height", "I")); connect_info.video_profile.height = (unsigned int)E->GetIntField(env, connect_video_profile_obj, E->GetFieldID(env, connect_video_profile_class, "height", "I"));
connect_info.video_profile.max_fps = (unsigned int)E->GetIntField(env, connect_video_profile_obj, E->GetFieldID(env, connect_video_profile_class, "maxFPS", "I")); connect_info.video_profile.max_fps = (unsigned int)E->GetIntField(env, connect_video_profile_obj, E->GetFieldID(env, connect_video_profile_class, "maxFPS", "I"));
connect_info.video_profile.bitrate = (unsigned int)E->GetIntField(env, connect_video_profile_obj, E->GetFieldID(env, connect_video_profile_class, "bitrate", "I")); connect_info.video_profile.bitrate = (unsigned int)E->GetIntField(env, connect_video_profile_obj, E->GetFieldID(env, connect_video_profile_class, "bitrate", "I"));
session = CHIAKI_NEW(AndroidChiakiSession); session = CHIAKI_NEW(AndroidChiakiSession);
if(!session) if(!session)
{ {
err = CHIAKI_ERR_MEMORY; err = CHIAKI_ERR_MEMORY;
goto beach; goto beach;
} }
err = chiaki_session_init(&session->session, &connect_info, &global_log); err = chiaki_session_init(&session->session, &connect_info, &global_log);
if(err != CHIAKI_ERR_SUCCESS) if(err != CHIAKI_ERR_SUCCESS)
{ {
session->java_session = NULL; session->java_session = NULL;
goto beach; goto beach;
} }
session->java_session = E->NewGlobalRef(env, java_session); session->java_session = E->NewGlobalRef(env, java_session);
session->java_session_class = E->GetObjectClass(env, session->java_session); session->java_session_class = E->GetObjectClass(env, session->java_session);
session->java_session_event_login_pin_request_meth = E->GetMethodID(env, session->java_session_class, "eventLoginPinRequest", "(Z)V"); session->java_session_event_login_pin_request_meth = E->GetMethodID(env, session->java_session_class, "eventLoginPinRequest", "(Z)V");
session->java_session_event_quit_meth = E->GetMethodID(env, session->java_session_class, "eventQuit", "(ILjava/lang/String;)V"); session->java_session_event_quit_meth = E->GetMethodID(env, session->java_session_class, "eventQuit", "(ILjava/lang/String;)V");
chiaki_session_set_event_cb(&session->session, android_chiaki_event_cb, session); chiaki_session_set_event_cb(&session->session, android_chiaki_event_cb, session);
beach: beach:
free(host_str); free(host_str);
E->SetIntField(env, result, E->GetFieldID(env, result_class, "errorCode", "I"), (jint)err); E->SetIntField(env, result, E->GetFieldID(env, result_class, "errorCode", "I"), (jint)err);
E->SetLongField(env, result, E->GetFieldID(env, result_class, "sessionPtr", "J"), (jlong)session); E->SetLongField(env, result, E->GetFieldID(env, result_class, "sessionPtr", "J"), (jlong)session);
} }
JNIEXPORT void JNICALL Java_com_metallic_chiaki_lib_ChiakiNative_sessionFree(JNIEnv *env, jobject obj, jlong ptr) JNIEXPORT void JNICALL Java_com_metallic_chiaki_lib_ChiakiNative_sessionFree(JNIEnv *env, jobject obj, jlong ptr)
{ {
AndroidChiakiSession *session = (AndroidChiakiSession *)ptr; AndroidChiakiSession *session = (AndroidChiakiSession *)ptr;
if(!session) if(!session)
return; return;
E->DeleteGlobalRef(env, session->java_session); E->DeleteGlobalRef(env, session->java_session);
chiaki_session_fini(&session->session); chiaki_session_fini(&session->session);
free(session); free(session);
} }
JNIEXPORT jint JNICALL Java_com_metallic_chiaki_lib_ChiakiNative_sessionStart(JNIEnv *env, jobject obj, jlong ptr) JNIEXPORT jint JNICALL Java_com_metallic_chiaki_lib_ChiakiNative_sessionStart(JNIEnv *env, jobject obj, jlong ptr)
{ {
AndroidChiakiSession *session = (AndroidChiakiSession *)ptr; AndroidChiakiSession *session = (AndroidChiakiSession *)ptr;
return chiaki_session_start(&session->session); return chiaki_session_start(&session->session);
} }
JNIEXPORT jint JNICALL Java_com_metallic_chiaki_lib_ChiakiNative_sessionStop(JNIEnv *env, jobject obj, jlong ptr) JNIEXPORT jint JNICALL Java_com_metallic_chiaki_lib_ChiakiNative_sessionStop(JNIEnv *env, jobject obj, jlong ptr)
{ {
AndroidChiakiSession *session = (AndroidChiakiSession *)ptr; AndroidChiakiSession *session = (AndroidChiakiSession *)ptr;
return chiaki_session_stop(&session->session); return chiaki_session_stop(&session->session);
} }
JNIEXPORT jint JNICALL Java_com_metallic_chiaki_lib_ChiakiNative_sessionJoin(JNIEnv *env, jobject obj, jlong ptr) JNIEXPORT jint JNICALL Java_com_metallic_chiaki_lib_ChiakiNative_sessionJoin(JNIEnv *env, jobject obj, jlong ptr)
{ {
AndroidChiakiSession *session = (AndroidChiakiSession *)ptr; AndroidChiakiSession *session = (AndroidChiakiSession *)ptr;
return chiaki_session_join(&session->session); return chiaki_session_join(&session->session);
} }