Pass RegisteredHost to Java

This commit is contained in:
Florian Märkl 2019-10-14 18:44:41 +02:00
commit 4f2e497855
No known key found for this signature in database
GPG key ID: 125BC8A5A6A1E857
4 changed files with 52 additions and 19 deletions

View file

@ -96,6 +96,13 @@ static jobject jnistr_from_ascii(JNIEnv *env, const char *str)
return r;
}
static jbyteArray jnibytearray_create(JNIEnv *env, const uint8_t *buf, size_t buf_size)
{
jbyteArray r = E->NewByteArray(env, buf_size);
E->SetByteArrayRegion(env, r, 0, buf_size, (const jbyte *)buf);
return r;
}
static jobject get_kotlin_global_object(JNIEnv *env, const char *id)
{
size_t idlen = strlen(id);
@ -635,6 +642,9 @@ typedef struct android_chiaki_regist_t
jobject java_regist_event_failed;
jclass java_regist_event_success_class;
jmethodID java_regist_event_success_ctor;
jclass java_regist_host_class;
jmethodID java_regist_host_ctor;
} AndroidChiakiRegist;
static void android_chiaki_regist_cb(ChiakiRegistEvent *event, void *user)
@ -655,8 +665,21 @@ static void android_chiaki_regist_cb(ChiakiRegistEvent *event, void *user)
java_event = regist->java_regist_event_failed;
break;
case CHIAKI_REGIST_EVENT_TYPE_FINISHED_SUCCESS:
java_event = E->NewObject(env, regist->java_regist_event_success_class, regist->java_regist_event_success_ctor, NULL /* TODO: RegistHost */);
{
ChiakiRegisteredHost *host = event->registered_host;
jobject java_host = E->NewObject(env, regist->java_regist_host_class, regist->java_regist_host_ctor,
jnistr_from_ascii(env, host->ap_ssid),
jnistr_from_ascii(env, host->ap_bssid),
jnistr_from_ascii(env, host->ap_key),
jnistr_from_ascii(env, host->ap_name),
jnibytearray_create(env, host->ps4_mac, sizeof(host->ps4_mac)),
jnistr_from_ascii(env, host->ps4_nickname),
jnibytearray_create(env, (const uint8_t *)host->rp_regist_key, sizeof(host->rp_regist_key)),
(jint)host->rp_key_type,
jnibytearray_create(env, host->rp_key, sizeof(host->rp_key)));
java_event = E->NewObject(env, regist->java_regist_event_success_class, regist->java_regist_event_success_ctor, java_host);
break;
}
}
if(java_event)
@ -672,6 +695,7 @@ static void android_chiaki_regist_fini_partial(JNIEnv *env, AndroidChiakiRegist
E->DeleteGlobalRef(env, regist->java_regist_event_canceled);
E->DeleteGlobalRef(env, regist->java_regist_event_failed);
E->DeleteGlobalRef(env, regist->java_regist_event_success_class);
E->DeleteGlobalRef(env, regist->java_regist_host_class);
}
JNIEXPORT void JNICALL JNI_FCN(registStart)(JNIEnv *env, jobject obj, jobject result, jobject regist_info_obj, jobject log_obj, jobject java_regist)
@ -695,6 +719,19 @@ JNIEXPORT void JNICALL JNI_FCN(registStart)(JNIEnv *env, jobject obj, jobject re
regist->java_regist_event_success_class = E->NewGlobalRef(env, E->FindClass(env, BASE_PACKAGE"/RegistEventSuccess"));
regist->java_regist_event_success_ctor = E->GetMethodID(env, regist->java_regist_event_success_class, "<init>", "(L"BASE_PACKAGE"/RegistHost;)V");
regist->java_regist_host_class = E->NewGlobalRef(env, E->FindClass(env, BASE_PACKAGE"/RegistHost"));
regist->java_regist_host_ctor = E->GetMethodID(env, regist->java_regist_host_class, "<init>", "("
"Ljava/lang/String;" // apSsid: String
"Ljava/lang/String;" // apBssid: String
"Ljava/lang/String;" // apKey: String
"Ljava/lang/String;" // apName: String
"[B" // ps4Mac: ByteArray
"Ljava/lang/String;" // ps4Nickname: String
"[B" // rpRegistKey: ByteArray
"I" // rpKeyType: UInt
"[B" // rpKey: ByteArray
")V");
jclass regist_info_class = E->GetObjectClass(env, regist_info_obj);
jstring host_string = E->GetObjectField(env, regist_info_obj, E->GetFieldID(env, regist_info_class, "host", "Ljava/lang/String;"));
jboolean broadcast = E->GetBooleanField(env, regist_info_obj, E->GetFieldID(env, regist_info_class, "broadcast", "Z"));

View file

@ -285,13 +285,13 @@ class DiscoveryService(
}
@Parcelize
data class RegistInfo(
val host: String,
val broadcast: Boolean,
val psnId: String, // TODO: this is outdated now
val pin: UInt
)
val pin: Int
): Parcelable
data class RegistHost(
val apSsid: String,

View file

@ -24,6 +24,7 @@ import android.view.Window
import androidx.appcompat.app.AppCompatActivity
import com.metallic.chiaki.R
import com.metallic.chiaki.common.ext.RevealActivity
import com.metallic.chiaki.lib.RegistInfo
import kotlinx.android.synthetic.main.activity_regist.*
class RegistActivity: AppCompatActivity(), RevealActivity
@ -69,11 +70,10 @@ class RegistActivity: AppCompatActivity(), RevealActivity
if(!hostValid || !psnIdValid || !pinValid)
return
val registInfo = RegistInfo(host, broadcast, psnId, pin.toInt())
Intent(this, RegistExecuteActivity::class.java).also {
it.putExtra(RegistExecuteActivity.EXTRA_HOST, host)
it.putExtra(RegistExecuteActivity.EXTRA_BROADCAST, broadcast)
it.putExtra(RegistExecuteActivity.EXTRA_PSN_ID, psnId)
it.putExtra(RegistExecuteActivity.EXTRA_PIN, pin.toUInt().toInt())
it.putExtra(RegistExecuteActivity.EXTRA_REGIST_INFO, registInfo)
startActivity(it)
}
}

View file

@ -33,10 +33,7 @@ class RegistExecuteActivity: AppCompatActivity()
{
companion object
{
const val EXTRA_HOST = "regist_host"
const val EXTRA_BROADCAST = "regist_broadcast"
const val EXTRA_PSN_ID = "regist_psn_id"
const val EXTRA_PIN = "regist_pin"
const val EXTRA_REGIST_INFO = "regist_info"
}
private lateinit var viewModel: RegistExecuteViewModel
@ -83,13 +80,12 @@ class RegistExecuteActivity: AppCompatActivity()
}
}
val registInfo = RegistInfo(
intent.getStringExtra(EXTRA_HOST) ?: return,
intent.getBooleanExtra(EXTRA_BROADCAST, false),
intent.getStringExtra(EXTRA_PSN_ID) ?: return,
intent.getIntExtra(EXTRA_PIN, 0).toUInt()
)
val registInfo = intent.getParcelableExtra<RegistInfo>(EXTRA_REGIST_INFO)
if(registInfo == null)
{
finish()
return
}
viewModel.start(registInfo)
}