From 7e58ac010e954c7aa708f82b45adce640eb91965 Mon Sep 17 00:00:00 2001 From: Juha Heinanen Date: Wed, 28 Mar 2018 14:30:31 +0300 Subject: [PATCH] fixed calling of Kotlin functions from C that made it possible to move remove UI related companion vars --- app/src/main/cpp/baresip.c | 31 ++++++++--------- .../kotlin/com/tutpro/baresip/MainActivity.kt | 33 +++++++++---------- 2 files changed, 32 insertions(+), 32 deletions(-) diff --git a/app/src/main/cpp/baresip.c b/app/src/main/cpp/baresip.c index 50970e72..d30aed71 100644 --- a/app/src/main/cpp/baresip.c +++ b/app/src/main/cpp/baresip.c @@ -18,7 +18,7 @@ #define LOGE(...) \ ((void)__android_log_print(ANDROID_LOG_ERROR, "Baresip", __VA_ARGS__)) -typedef struct tick_context { +typedef struct update_context { JavaVM *javaVM; jclass jniHelperClz; jobject jniHelperObj; @@ -26,9 +26,9 @@ typedef struct tick_context { jobject mainActivityObj; pthread_mutex_t lock; int done; -} TickContext; +} UpdateContext; -TickContext g_ctx; +UpdateContext g_ctx; static void signal_handler(int sig) { @@ -103,7 +103,7 @@ static void ua_event_handler(struct ua *ua, enum ua_event ev, } event = event_buf; - TickContext *pctx = (TickContext*)(&g_ctx); + UpdateContext *pctx = (UpdateContext*)(&g_ctx); JavaVM *javaVM = pctx->javaVM; JNIEnv *env; jint res = (*javaVM)->GetEnv(javaVM, (void**)&env, JNI_VERSION_1_6); @@ -114,7 +114,7 @@ static void ua_event_handler(struct ua *ua, enum ua_event ev, return; } } - jmethodID statusId = (*env)->GetMethodID(env, pctx->jniHelperClz, + jmethodID statusId = (*env)->GetMethodID(env, pctx->mainActivityClz, "updateStatus", "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V"); sprintf(ua_buf, "%lu", (unsigned long)ua); @@ -123,7 +123,7 @@ static void ua_event_handler(struct ua *ua, enum ua_event ev, jstring javaCall = (*env)->NewStringUTF(env, call_buf); jstring javaEvent = (*env)->NewStringUTF(env, event); LOGD("sending ua/call %s/%s event %s\n", ua_buf, call_buf, event); - (*env)->CallVoidMethod(env, pctx->jniHelperObj, statusId, javaEvent, javaUA, javaCall); + (*env)->CallVoidMethod(env, pctx->mainActivityObj, statusId, javaEvent, javaUA, javaCall); (*env)->DeleteLocalRef(env, javaUA); (*env)->DeleteLocalRef(env, javaCall); (*env)->DeleteLocalRef(env, javaEvent); @@ -181,24 +181,25 @@ JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM* vm, void* reserved) { jclass clz = (*env)->FindClass(env, "com/tutpro/baresip/MainActivity"); g_ctx.jniHelperClz = (*env)->NewGlobalRef(env, clz); - jmethodID jniHelperCtor = (*env)->GetMethodID(env, g_ctx.jniHelperClz, - "", "()V"); - jobject handler = (*env)->NewObject(env, g_ctx.jniHelperClz, - jniHelperCtor); + jmethodID jniHelperCtor = (*env)->GetMethodID(env, g_ctx.jniHelperClz, "", "()V"); + jobject handler = (*env)->NewObject(env, g_ctx.jniHelperClz, jniHelperCtor); g_ctx.jniHelperObj = (*env)->NewGlobalRef(env, handler); - g_ctx.done = 0; g_ctx.mainActivityObj = NULL; return JNI_VERSION_1_6; } JNIEXPORT void JNICALL -Java_com_tutpro_baresip_MainActivity_baresipStart(JNIEnv *env, jobject thiz, jstring javaPath) +Java_com_tutpro_baresip_MainActivity_baresipStart(JNIEnv *env, jobject instance, jstring javaPath) { int err; const char *path = (*env)->GetStringUTFChars(env, javaPath, 0); struct le *le; + jclass clz = (*env)->GetObjectClass(env, instance); + g_ctx.mainActivityClz = (*env)->NewGlobalRef(env, clz); + g_ctx.mainActivityObj = (*env)->NewGlobalRef(env, instance); + runLoggingThread(); err = libre_init(); @@ -237,7 +238,7 @@ Java_com_tutpro_baresip_MainActivity_baresipStart(JNIEnv *env, jobject thiz, jst goto out; } - TickContext *pctx = (TickContext*)(&g_ctx); + UpdateContext *pctx = (UpdateContext*)(&g_ctx); JavaVM *javaVM = pctx->javaVM; jint res = (*javaVM)->GetEnv(javaVM, (void**)&env, JNI_VERSION_1_6); if (res != JNI_OK) { @@ -256,9 +257,9 @@ Java_com_tutpro_baresip_MainActivity_baresipStart(JNIEnv *env, jobject thiz, jst sprintf(ua_buf, "%lu", (unsigned long)ua); jstring javaUA = (*env)->NewStringUTF(env, ua_buf); LOGD("adding account %s/%s\n", ua_aor(ua), ua_buf); - jmethodID accountId = (*env)->GetMethodID(env, pctx->jniHelperClz, "addAccount", + jmethodID accountId = (*env)->GetMethodID(env, pctx->mainActivityClz, "addAccount", "(Ljava/lang/String;)V"); - (*env)->CallVoidMethod(env, pctx->jniHelperObj, accountId, javaUA); + (*env)->CallVoidMethod(env, pctx->mainActivityObj, accountId, javaUA); (*env)->DeleteLocalRef(env, javaUA); } diff --git a/app/src/main/kotlin/com/tutpro/baresip/MainActivity.kt b/app/src/main/kotlin/com/tutpro/baresip/MainActivity.kt index 7d38ca66..b3b9af68 100644 --- a/app/src/main/kotlin/com/tutpro/baresip/MainActivity.kt +++ b/app/src/main/kotlin/com/tutpro/baresip/MainActivity.kt @@ -24,6 +24,14 @@ import android.widget.RelativeLayout class MainActivity : AppCompatActivity() { + internal lateinit var appContext: Context + internal lateinit var layout: RelativeLayout + internal lateinit var callee: AutoCompleteTextView + internal lateinit var callButton: Button + internal lateinit var holdButton: Button + internal lateinit var accountAdapter: AccountSpinnerAdapter + internal lateinit var aorSpinner: Spinner + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) @@ -132,9 +140,9 @@ class MainActivity : AppCompatActivity() { EditContactsActivity.updateContactsAndNames(applicationContext.filesDir.absolutePath + "/contacts") - calleeAdapter = ArrayAdapter(this, android.R.layout.select_dialog_item, EditContactsActivity.Names) callee.threshold = 2 - callee.setAdapter>(calleeAdapter) + callee.setAdapter>(ArrayAdapter(this, + android.R.layout.select_dialog_item, EditContactsActivity.Names)) callButton.text = "Call" callButton.setOnClickListener { @@ -394,7 +402,7 @@ class MainActivity : AppCompatActivity() { Log.d("Baresip", "Updating Hangup and Hold") callsIn[final_in_index].status = "Hangup" callsIn[final_in_index].hold = false - runOnUiThread { + this@MainActivity.runOnUiThread { val answer_id = (final_in_index + 1) * 10 + 2 val answer_but = layout.findViewById(answer_id) as Button answer_but.text = "Hangup" @@ -496,7 +504,7 @@ class MainActivity : AppCompatActivity() { accounts.add(Account(ua, aor, "")) aors.add(aor) images.add(R.drawable.yellow) - runOnUiThread { accountAdapter.notifyDataSetChanged() } + this@MainActivity.runOnUiThread { accountAdapter.notifyDataSetChanged() } } @Keep @@ -518,14 +526,14 @@ class MainActivity : AppCompatActivity() { accounts[account_index].status = "OK" aors[account_index] = aor images[account_index] = R.drawable.green - runOnUiThread { accountAdapter.notifyDataSetChanged() } + this@MainActivity.runOnUiThread { accountAdapter.notifyDataSetChanged() } } "registering failed" -> { Log.d("Baresip", "Setting status to red") accounts[account_index].status = "FAIL" aors[account_index] = aor images[account_index] = R.drawable.red - runOnUiThread { accountAdapter.notifyDataSetChanged() } + this@MainActivity.runOnUiThread { accountAdapter.notifyDataSetChanged() } } "call ringing" -> { } @@ -535,7 +543,7 @@ class MainActivity : AppCompatActivity() { Log.d("Baresip", "Outbound call " + call + " established") callsOut[out_index].status = "Hangup" callsOut[out_index].hold = false - runOnUiThread { + this@MainActivity.runOnUiThread { if (ua == aor_ua(aors[aorSpinner.selectedItemPosition])) { callButton.text = "Hangup" holdButton.text = "Hold" @@ -595,7 +603,7 @@ class MainActivity : AppCompatActivity() { Log.d("Baresip", "Removing outgoing call " + ua + "/" + call + "/" + callsOut[call_index].peerURI) callsOut.removeAt(call_index) - runOnUiThread { + this@MainActivity.runOnUiThread { if (ua == aor_ua(aors[aorSpinner.selectedItemPosition])) { callButton.text = "Call" callButton.isEnabled = true @@ -635,15 +643,6 @@ class MainActivity : AppCompatActivity() { companion object { - internal lateinit var appContext: Context - internal lateinit var layout: RelativeLayout - internal lateinit var callee: AutoCompleteTextView - internal lateinit var callButton: Button - internal lateinit var holdButton: Button - internal lateinit var accountAdapter: AccountSpinnerAdapter - internal lateinit var aorSpinner: Spinner - internal lateinit var calleeAdapter: ArrayAdapter - internal var running: Boolean = false internal var accounts = ArrayList() internal var aors = ArrayList()