From 093cd6e4430f9e74e74475940094283466448b20 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20M=C3=A4rkl?= Date: Sun, 15 Sep 2019 11:53:04 +0200 Subject: [PATCH] Start Session on Android --- android/app/build.gradle | 5 ++ android/app/src/main/AndroidManifest.xml | 7 ++- android/app/src/main/cpp/chiaki-jni.c | 8 ++- .../java/com/metallic/chiaki/MainActivity.kt | 53 +++++++++++++++---- .../com/metallic/chiaki/StreamActivity.kt | 34 ++++++++++++ .../java/com/metallic/chiaki/lib/Chiaki.kt | 37 ++++++++++--- .../app/src/main/res/layout/activity_main.xml | 43 +++++++++++++-- .../src/main/res/layout/activity_stream.xml | 19 +++++++ cmake/OpenSSLExternalProject.cmake | 2 +- lib/src/session.c | 5 ++ 10 files changed, 190 insertions(+), 23 deletions(-) create mode 100644 android/app/src/main/java/com/metallic/chiaki/StreamActivity.kt create mode 100644 android/app/src/main/res/layout/activity_stream.xml diff --git a/android/app/build.gradle b/android/app/build.gradle index e58415d..c7a72e1 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -39,6 +39,11 @@ android { } } +androidExtensions { + // for @Parcelize + experimental = true +} + dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) implementation"org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index 7a79c5c..01d8172 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -2,6 +2,9 @@ + + + + - + + \ No newline at end of file diff --git a/android/app/src/main/cpp/chiaki-jni.c b/android/app/src/main/cpp/chiaki-jni.c index 6c95d7d..64bf535 100644 --- a/android/app/src/main/cpp/chiaki-jni.c +++ b/android/app/src/main/cpp/chiaki-jni.c @@ -55,7 +55,7 @@ JNIEXPORT jstring JNICALL Java_com_metallic_chiaki_lib_ChiakiNative_errorCodeToS return E->NewStringUTF(env, chiaki_error_string((ChiakiErrorCode)value)); } -JNIEXPORT void JNICALL Java_com_metallic_chiaki_lib_ChiakiNative_createSession(JNIEnv *env, jobject obj, jobject result, jobject connect_info_obj) +JNIEXPORT void JNICALL Java_com_metallic_chiaki_lib_ChiakiNative_sessionCreate(JNIEnv *env, jobject obj, jobject result, jobject connect_info_obj) { ChiakiSession *session = NULL; ChiakiErrorCode err = CHIAKI_ERR_SUCCESS; @@ -119,4 +119,10 @@ beach: free(host_str); 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); +} + +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 diff --git a/android/app/src/main/java/com/metallic/chiaki/MainActivity.kt b/android/app/src/main/java/com/metallic/chiaki/MainActivity.kt index e03e48a..8423c27 100644 --- a/android/app/src/main/java/com/metallic/chiaki/MainActivity.kt +++ b/android/app/src/main/java/com/metallic/chiaki/MainActivity.kt @@ -1,11 +1,13 @@ package com.metallic.chiaki +import android.content.Context +import android.content.Intent import androidx.appcompat.app.AppCompatActivity import android.os.Bundle -import com.metallic.chiaki.lib.ChiakiNative -import com.metallic.chiaki.lib.ConnectInfo -import com.metallic.chiaki.lib.ConnectVideoProfile -import com.metallic.chiaki.lib.ErrorCode +import android.util.Base64 +import androidx.core.content.edit +import androidx.core.widget.addTextChangedListener +import com.metallic.chiaki.lib.* import kotlinx.android.synthetic.main.activity_main.* class MainActivity : AppCompatActivity() @@ -15,12 +17,43 @@ class MainActivity : AppCompatActivity() super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) - val result = ChiakiNative.CreateSessionResult(0, 0) - ChiakiNative.createSession(result, ConnectInfo("host", - ByteArray(0x10) { 0 }, - ByteArray(0x10) { 0 }, - ConnectVideoProfile(0, 0, 0, 0))) + val prefs = getPreferences(Context.MODE_PRIVATE) - testTextView.text = "${ErrorCode(0).toString()}\n${result}\n${ErrorCode(result.errorCode)}" + hostEditText.setText(prefs.getString("debug_host", "")) + registKeyEditText.setText(prefs.getString("debug_regist_key", "")) + morningEditText.setText(prefs.getString("debug_morning", "")) + + hostEditText.addTextChangedListener { + prefs.edit { + putString("debug_host", it?.toString()) + } + } + + registKeyEditText.addTextChangedListener { + prefs.edit { + putString("debug_regist_key", it?.toString()) + } + } + + morningEditText.addTextChangedListener { + prefs.edit { + putString("debug_morning", it?.toString()) + } + } + + startButton.setOnClickListener { + val registKeyBase = registKeyEditText.text.toString().toByteArray(Charsets.US_ASCII) + val registKey = registKeyBase + ByteArray(0x10 - registKeyBase.size) { 0 } + val morning = Base64.decode(morningEditText.text.toString(), Base64.DEFAULT) + val connectInfo = ConnectInfo(hostEditText.text.toString(), + registKey, + morning, + ConnectVideoProfile(1280, 720, 60, 10000)) + + Intent(this, StreamActivity::class.java).let { + it.putExtra(StreamActivity.EXTRA_CONNECT_INFO, connectInfo) + startActivity(it) + } + } } } diff --git a/android/app/src/main/java/com/metallic/chiaki/StreamActivity.kt b/android/app/src/main/java/com/metallic/chiaki/StreamActivity.kt new file mode 100644 index 0000000..3ef5116 --- /dev/null +++ b/android/app/src/main/java/com/metallic/chiaki/StreamActivity.kt @@ -0,0 +1,34 @@ +package com.metallic.chiaki + +import android.os.Bundle +import androidx.appcompat.app.AppCompatActivity +import com.metallic.chiaki.lib.ConnectInfo +import com.metallic.chiaki.lib.Session +import kotlinx.android.synthetic.main.activity_stream.* + +class StreamActivity : AppCompatActivity() +{ + companion object + { + const val EXTRA_CONNECT_INFO = "connect_info" + } + + private lateinit var session: Session + + override fun onCreate(savedInstanceState: Bundle?) + { + super.onCreate(savedInstanceState) + setContentView(R.layout.activity_stream) + + val connectInfo = intent.getParcelableExtra(EXTRA_CONNECT_INFO) + if(connectInfo == null) + { + finish() + return + } + + session = Session(connectInfo) + session.start() + testTextView.text = "" + } +} 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 d01e663..246df5e 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 @@ -1,22 +1,28 @@ package com.metallic.chiaki.lib +import android.os.Parcelable +import kotlinx.android.parcel.Parcelize +import java.lang.Exception + +@Parcelize data class ConnectVideoProfile( val width: Int, val height: Int, val maxFPS: Int, val bitrate: Int -) +): Parcelable +@Parcelize data class ConnectInfo( val host: String, val registKey: ByteArray, val morning: ByteArray, val videoProfile: ConnectVideoProfile -) +): Parcelable class ChiakiNative { - data class CreateSessionResult(var errorCode: Int, var sessionPtr: Long) + data class SessionCreateResult(var errorCode: Int, var sessionPtr: Long) companion object { init @@ -24,16 +30,35 @@ class ChiakiNative System.loadLibrary("chiaki-jni") } @JvmStatic external fun errorCodeToString(value: Int): String - @JvmStatic external fun createSession(result: CreateSessionResult, connectInfo: ConnectInfo) + @JvmStatic external fun sessionCreate(result: SessionCreateResult, connectInfo: ConnectInfo) + @JvmStatic external fun sessionStart(ptr: Long): Int } } class ErrorCode(val value: Int) { override fun toString() = ChiakiNative.errorCodeToString(value) + var isSuccess = value == 0 } -class Session +class SessionCreateError(val errorCode: ErrorCode): Exception("Failed to create Session: $errorCode") + +class Session(connectInfo: ConnectInfo) { - private val nativePtr: Long = 0 + private val nativePtr: Long + + init + { + val result = ChiakiNative.SessionCreateResult(0, 0) + ChiakiNative.sessionCreate(result, connectInfo) + val errorCode = ErrorCode(result.errorCode) + if(!errorCode.isSuccess) + throw SessionCreateError(errorCode) + nativePtr = result.sessionPtr + } + + fun start() + { + ChiakiNative.sessionStart(nativePtr) + } } \ No newline at end of file diff --git a/android/app/src/main/res/layout/activity_main.xml b/android/app/src/main/res/layout/activity_main.xml index 145e02f..7e350d7 100644 --- a/android/app/src/main/res/layout/activity_main.xml +++ b/android/app/src/main/res/layout/activity_main.xml @@ -6,14 +6,49 @@ android:layout_height="match_parent" tools:context=".MainActivity"> - + + + + + + +