From cb65009f59eba018b3252f532a53d429a9ea9e07 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20M=C3=A4rkl?= Date: Sun, 15 Sep 2019 12:06:32 +0200 Subject: [PATCH] Free Session on Android --- android/app/src/main/cpp/chiaki-jni.c | 23 ++++++++++++++++++- .../com/metallic/chiaki/StreamActivity.kt | 23 ++++++++++++++++--- .../java/com/metallic/chiaki/lib/Chiaki.kt | 16 ++++++++++--- 3 files changed, 55 insertions(+), 7 deletions(-) diff --git a/android/app/src/main/cpp/chiaki-jni.c b/android/app/src/main/cpp/chiaki-jni.c index 64bf535..770b0c0 100644 --- a/android/app/src/main/cpp/chiaki-jni.c +++ b/android/app/src/main/cpp/chiaki-jni.c @@ -121,8 +121,29 @@ beach: 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) +{ + ChiakiSession *session = (ChiakiSession *)ptr; + if(!session) + return; + chiaki_session_fini(session); + free(session); +} + JNIEXPORT jint JNICALL Java_com_metallic_chiaki_lib_ChiakiNative_sessionStart(JNIEnv *env, jobject obj, jlong ptr) { ChiakiSession *session = (ChiakiSession *)ptr; return chiaki_session_start(session); -} \ No newline at end of file +} + +JNIEXPORT jint JNICALL Java_com_metallic_chiaki_lib_ChiakiNative_sessionStop(JNIEnv *env, jobject obj, jlong ptr) +{ + ChiakiSession *session = (ChiakiSession *)ptr; + return chiaki_session_stop(session); +} + +JNIEXPORT jint JNICALL Java_com_metallic_chiaki_lib_ChiakiNative_sessionJoin(JNIEnv *env, jobject obj, jlong ptr) +{ + ChiakiSession *session = (ChiakiSession *)ptr; + return chiaki_session_join(session); +} diff --git a/android/app/src/main/java/com/metallic/chiaki/StreamActivity.kt b/android/app/src/main/java/com/metallic/chiaki/StreamActivity.kt index 3ef5116..bc94e50 100644 --- a/android/app/src/main/java/com/metallic/chiaki/StreamActivity.kt +++ b/android/app/src/main/java/com/metallic/chiaki/StreamActivity.kt @@ -4,6 +4,7 @@ import android.os.Bundle import androidx.appcompat.app.AppCompatActivity import com.metallic.chiaki.lib.ConnectInfo import com.metallic.chiaki.lib.Session +import com.metallic.chiaki.lib.SessionCreateError import kotlinx.android.synthetic.main.activity_stream.* class StreamActivity : AppCompatActivity() @@ -13,7 +14,7 @@ class StreamActivity : AppCompatActivity() const val EXTRA_CONNECT_INFO = "connect_info" } - private lateinit var session: Session + private var session: Session? = null override fun onCreate(savedInstanceState: Bundle?) { @@ -27,8 +28,24 @@ class StreamActivity : AppCompatActivity() return } - session = Session(connectInfo) - session.start() + try + { + val session = Session(connectInfo) + session.start() + this.session = session + } + catch(e: SessionCreateError) + { + // TODO: handle error + } + testTextView.text = "" } + + override fun onDestroy() + { + super.onDestroy() + session?.stop() + session?.dispose() + } } diff --git a/android/app/src/main/java/com/metallic/chiaki/lib/Chiaki.kt b/android/app/src/main/java/com/metallic/chiaki/lib/Chiaki.kt index 246df5e..0e57770 100644 --- a/android/app/src/main/java/com/metallic/chiaki/lib/Chiaki.kt +++ b/android/app/src/main/java/com/metallic/chiaki/lib/Chiaki.kt @@ -31,7 +31,10 @@ class ChiakiNative } @JvmStatic external fun errorCodeToString(value: Int): String @JvmStatic external fun sessionCreate(result: SessionCreateResult, connectInfo: ConnectInfo) + @JvmStatic external fun sessionFree(ptr: Long) @JvmStatic external fun sessionStart(ptr: Long): Int + @JvmStatic external fun sessionStop(ptr: Long): Int + @JvmStatic external fun sessionJoin(ptr: Long): Int } } @@ -45,7 +48,7 @@ class SessionCreateError(val errorCode: ErrorCode): Exception("Failed to create class Session(connectInfo: ConnectInfo) { - private val nativePtr: Long + private var nativePtr: Long init { @@ -57,8 +60,15 @@ class Session(connectInfo: ConnectInfo) nativePtr = result.sessionPtr } - fun start() + fun start() = ErrorCode(ChiakiNative.sessionStart(nativePtr)) + fun stop() = ErrorCode(ChiakiNative.sessionStop(nativePtr)) + + fun dispose() { - ChiakiNative.sessionStart(nativePtr) + if(nativePtr == 0L) + return + ChiakiNative.sessionJoin(nativePtr) + ChiakiNative.sessionFree(nativePtr) + nativePtr = 0L } } \ No newline at end of file