fixed calling of Kotlin functions from C that made it possible to move

remove UI related companion vars
This commit is contained in:
Juha Heinanen
2018-03-28 14:30:31 +03:00
parent 44f77567c1
commit 7e58ac010e
2 changed files with 32 additions and 32 deletions

View File

@ -18,7 +18,7 @@
#define LOGE(...) \ #define LOGE(...) \
((void)__android_log_print(ANDROID_LOG_ERROR, "Baresip", __VA_ARGS__)) ((void)__android_log_print(ANDROID_LOG_ERROR, "Baresip", __VA_ARGS__))
typedef struct tick_context { typedef struct update_context {
JavaVM *javaVM; JavaVM *javaVM;
jclass jniHelperClz; jclass jniHelperClz;
jobject jniHelperObj; jobject jniHelperObj;
@ -26,9 +26,9 @@ typedef struct tick_context {
jobject mainActivityObj; jobject mainActivityObj;
pthread_mutex_t lock; pthread_mutex_t lock;
int done; int done;
} TickContext; } UpdateContext;
TickContext g_ctx; UpdateContext g_ctx;
static void signal_handler(int sig) 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; event = event_buf;
TickContext *pctx = (TickContext*)(&g_ctx); UpdateContext *pctx = (UpdateContext*)(&g_ctx);
JavaVM *javaVM = pctx->javaVM; JavaVM *javaVM = pctx->javaVM;
JNIEnv *env; JNIEnv *env;
jint res = (*javaVM)->GetEnv(javaVM, (void**)&env, JNI_VERSION_1_6); 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; return;
} }
} }
jmethodID statusId = (*env)->GetMethodID(env, pctx->jniHelperClz, jmethodID statusId = (*env)->GetMethodID(env, pctx->mainActivityClz,
"updateStatus", "updateStatus",
"(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V"); "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V");
sprintf(ua_buf, "%lu", (unsigned long)ua); 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 javaCall = (*env)->NewStringUTF(env, call_buf);
jstring javaEvent = (*env)->NewStringUTF(env, event); jstring javaEvent = (*env)->NewStringUTF(env, event);
LOGD("sending ua/call %s/%s event %s\n", ua_buf, call_buf, 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, javaUA);
(*env)->DeleteLocalRef(env, javaCall); (*env)->DeleteLocalRef(env, javaCall);
(*env)->DeleteLocalRef(env, javaEvent); (*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"); jclass clz = (*env)->FindClass(env, "com/tutpro/baresip/MainActivity");
g_ctx.jniHelperClz = (*env)->NewGlobalRef(env, clz); g_ctx.jniHelperClz = (*env)->NewGlobalRef(env, clz);
jmethodID jniHelperCtor = (*env)->GetMethodID(env, g_ctx.jniHelperClz, jmethodID jniHelperCtor = (*env)->GetMethodID(env, g_ctx.jniHelperClz, "<init>", "()V");
"<init>", "()V"); jobject handler = (*env)->NewObject(env, g_ctx.jniHelperClz, jniHelperCtor);
jobject handler = (*env)->NewObject(env, g_ctx.jniHelperClz,
jniHelperCtor);
g_ctx.jniHelperObj = (*env)->NewGlobalRef(env, handler); g_ctx.jniHelperObj = (*env)->NewGlobalRef(env, handler);
g_ctx.done = 0;
g_ctx.mainActivityObj = NULL; g_ctx.mainActivityObj = NULL;
return JNI_VERSION_1_6; return JNI_VERSION_1_6;
} }
JNIEXPORT void JNICALL 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; int err;
const char *path = (*env)->GetStringUTFChars(env, javaPath, 0); const char *path = (*env)->GetStringUTFChars(env, javaPath, 0);
struct le *le; struct le *le;
jclass clz = (*env)->GetObjectClass(env, instance);
g_ctx.mainActivityClz = (*env)->NewGlobalRef(env, clz);
g_ctx.mainActivityObj = (*env)->NewGlobalRef(env, instance);
runLoggingThread(); runLoggingThread();
err = libre_init(); err = libre_init();
@ -237,7 +238,7 @@ Java_com_tutpro_baresip_MainActivity_baresipStart(JNIEnv *env, jobject thiz, jst
goto out; goto out;
} }
TickContext *pctx = (TickContext*)(&g_ctx); UpdateContext *pctx = (UpdateContext*)(&g_ctx);
JavaVM *javaVM = pctx->javaVM; JavaVM *javaVM = pctx->javaVM;
jint res = (*javaVM)->GetEnv(javaVM, (void**)&env, JNI_VERSION_1_6); jint res = (*javaVM)->GetEnv(javaVM, (void**)&env, JNI_VERSION_1_6);
if (res != JNI_OK) { 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); sprintf(ua_buf, "%lu", (unsigned long)ua);
jstring javaUA = (*env)->NewStringUTF(env, ua_buf); jstring javaUA = (*env)->NewStringUTF(env, ua_buf);
LOGD("adding account %s/%s\n", ua_aor(ua), 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"); "(Ljava/lang/String;)V");
(*env)->CallVoidMethod(env, pctx->jniHelperObj, accountId, javaUA); (*env)->CallVoidMethod(env, pctx->mainActivityObj, accountId, javaUA);
(*env)->DeleteLocalRef(env, javaUA); (*env)->DeleteLocalRef(env, javaUA);
} }

View File

@ -24,6 +24,14 @@ import android.widget.RelativeLayout
class MainActivity : AppCompatActivity() { 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?) { override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
@ -132,9 +140,9 @@ class MainActivity : AppCompatActivity() {
EditContactsActivity.updateContactsAndNames(applicationContext.filesDir.absolutePath + "/contacts") EditContactsActivity.updateContactsAndNames(applicationContext.filesDir.absolutePath + "/contacts")
calleeAdapter = ArrayAdapter(this, android.R.layout.select_dialog_item, EditContactsActivity.Names)
callee.threshold = 2 callee.threshold = 2
callee.setAdapter<ArrayAdapter<String>>(calleeAdapter) callee.setAdapter<ArrayAdapter<String>>(ArrayAdapter(this,
android.R.layout.select_dialog_item, EditContactsActivity.Names))
callButton.text = "Call" callButton.text = "Call"
callButton.setOnClickListener { callButton.setOnClickListener {
@ -394,7 +402,7 @@ class MainActivity : AppCompatActivity() {
Log.d("Baresip", "Updating Hangup and Hold") Log.d("Baresip", "Updating Hangup and Hold")
callsIn[final_in_index].status = "Hangup" callsIn[final_in_index].status = "Hangup"
callsIn[final_in_index].hold = false callsIn[final_in_index].hold = false
runOnUiThread { this@MainActivity.runOnUiThread {
val answer_id = (final_in_index + 1) * 10 + 2 val answer_id = (final_in_index + 1) * 10 + 2
val answer_but = layout.findViewById(answer_id) as Button val answer_but = layout.findViewById(answer_id) as Button
answer_but.text = "Hangup" answer_but.text = "Hangup"
@ -496,7 +504,7 @@ class MainActivity : AppCompatActivity() {
accounts.add(Account(ua, aor, "")) accounts.add(Account(ua, aor, ""))
aors.add(aor) aors.add(aor)
images.add(R.drawable.yellow) images.add(R.drawable.yellow)
runOnUiThread { accountAdapter.notifyDataSetChanged() } this@MainActivity.runOnUiThread { accountAdapter.notifyDataSetChanged() }
} }
@Keep @Keep
@ -518,14 +526,14 @@ class MainActivity : AppCompatActivity() {
accounts[account_index].status = "OK" accounts[account_index].status = "OK"
aors[account_index] = aor aors[account_index] = aor
images[account_index] = R.drawable.green images[account_index] = R.drawable.green
runOnUiThread { accountAdapter.notifyDataSetChanged() } this@MainActivity.runOnUiThread { accountAdapter.notifyDataSetChanged() }
} }
"registering failed" -> { "registering failed" -> {
Log.d("Baresip", "Setting status to red") Log.d("Baresip", "Setting status to red")
accounts[account_index].status = "FAIL" accounts[account_index].status = "FAIL"
aors[account_index] = aor aors[account_index] = aor
images[account_index] = R.drawable.red images[account_index] = R.drawable.red
runOnUiThread { accountAdapter.notifyDataSetChanged() } this@MainActivity.runOnUiThread { accountAdapter.notifyDataSetChanged() }
} }
"call ringing" -> { "call ringing" -> {
} }
@ -535,7 +543,7 @@ class MainActivity : AppCompatActivity() {
Log.d("Baresip", "Outbound call " + call + " established") Log.d("Baresip", "Outbound call " + call + " established")
callsOut[out_index].status = "Hangup" callsOut[out_index].status = "Hangup"
callsOut[out_index].hold = false callsOut[out_index].hold = false
runOnUiThread { this@MainActivity.runOnUiThread {
if (ua == aor_ua(aors[aorSpinner.selectedItemPosition])) { if (ua == aor_ua(aors[aorSpinner.selectedItemPosition])) {
callButton.text = "Hangup" callButton.text = "Hangup"
holdButton.text = "Hold" holdButton.text = "Hold"
@ -595,7 +603,7 @@ class MainActivity : AppCompatActivity() {
Log.d("Baresip", "Removing outgoing call " + ua + "/" + Log.d("Baresip", "Removing outgoing call " + ua + "/" +
call + "/" + callsOut[call_index].peerURI) call + "/" + callsOut[call_index].peerURI)
callsOut.removeAt(call_index) callsOut.removeAt(call_index)
runOnUiThread { this@MainActivity.runOnUiThread {
if (ua == aor_ua(aors[aorSpinner.selectedItemPosition])) { if (ua == aor_ua(aors[aorSpinner.selectedItemPosition])) {
callButton.text = "Call" callButton.text = "Call"
callButton.isEnabled = true callButton.isEnabled = true
@ -635,15 +643,6 @@ class MainActivity : AppCompatActivity() {
companion object { 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<String>
internal var running: Boolean = false internal var running: Boolean = false
internal var accounts = ArrayList<Account>() internal var accounts = ArrayList<Account>()
internal var aors = ArrayList<String>() internal var aors = ArrayList<String>()