diff --git a/jni/lokinet_config.cpp b/jni/lokinet_config.cpp index 8cf59e10b..9738eb382 100644 --- a/jni/lokinet_config.cpp +++ b/jni/lokinet_config.cpp @@ -24,7 +24,7 @@ extern "C Java_network_loki_lokinet_LokinetConfig_Load(JNIEnv* env, jobject self, jstring fname) { - llarp_config* conf = FromObjectMember< llarp_config >(env, self, "impl"); + llarp_config* conf = GetImpl< llarp_config >(env, self); if(conf == nullptr) return JNI_FALSE; return VisitStringAsStringView< jboolean >( diff --git a/jni/lokinet_daemon.cpp b/jni/lokinet_daemon.cpp index 8a542bbcc..22f22f2cb 100644 --- a/jni/lokinet_daemon.cpp +++ b/jni/lokinet_daemon.cpp @@ -25,8 +25,8 @@ extern "C" Java_network_loki_lokinet_LokinetDaemon_Configure(JNIEnv *env, jobject self, jobject conf) { - llarp_main *ptr = FromObjectMember< llarp_main >(env, self, "impl"); - llarp_config *config = FromObjectMember< llarp_config >(env, conf, "impl"); + llarp_main *ptr = GetImpl< llarp_main >(env, self); + llarp_config *config = GetImpl< llarp_config >(env, conf); if(ptr == nullptr || config == nullptr) return JNI_FALSE; if(llarp_main_configure(ptr, config)) @@ -38,7 +38,7 @@ extern "C" Java_network_loki_lokinet_LokinetDaemon_Mainloop(JNIEnv *env, jobject self) { static llarp_main_runtime_opts opts; - llarp_main *ptr = FromObjectMember< llarp_main >(env, self, "impl"); + llarp_main *ptr = GetImpl< llarp_main >(env, self); if(ptr == nullptr) return -1; return llarp_main_run(ptr, opts); @@ -47,7 +47,7 @@ extern "C" JNIEXPORT jboolean JNICALL Java_network_loki_lokinet_LokinetDaemon_IsRunning(JNIEnv *env, jobject self) { - llarp_main *ptr = FromObjectMember< llarp_main >(env, self, "impl"); + llarp_main *ptr = GetImpl< llarp_main >(env, self); return (ptr != nullptr && llarp_main_is_running(ptr)) ? JNI_TRUE : JNI_FALSE; } @@ -55,7 +55,7 @@ extern "C" JNIEXPORT jboolean JNICALL Java_network_loki_lokinet_LokinetDaemon_Stop(JNIEnv *env, jobject self) { - llarp_main *ptr = FromObjectMember< llarp_main >(env, self, "impl"); + llarp_main *ptr = GetImpl< llarp_main >(env, self); if(ptr == nullptr) return JNI_FALSE; if(not llarp_main_is_running(ptr)) @@ -68,13 +68,14 @@ extern "C" Java_network_loki_lokinet_LokinetDaemon_InjectVPN(JNIEnv *env, jobject self, jobject vpn) { - llarp_main *ptr = FromObjectMember< llarp_main >(env, self, "impl"); - lokinet_jni_vpnio *impl = - FromObjectMember< lokinet_jni_vpnio >(env, vpn, "impl"); + llarp_main *ptr = GetImpl< llarp_main >(env, self); + lokinet_jni_vpnio *impl = GetImpl< lokinet_jni_vpnio >(env, vpn); if(ptr == nullptr || impl == nullptr) return JNI_FALSE; + if(impl->info.netmask == 0) + return JNI_FALSE; if(not impl->Init(ptr)) - return JNI_FASE; + return JNI_FALSE; return llarp_main_inject_default_vpn(ptr, &impl->io, impl->info) ? JNI_TRUE : JNI_FALSE; diff --git a/jni/lokinet_jni_common.hpp b/jni/lokinet_jni_common.hpp index 77dfd1d98..a70435e42 100644 --- a/jni/lokinet_jni_common.hpp +++ b/jni/lokinet_jni_common.hpp @@ -6,6 +6,7 @@ #include /// visit string as native bytes +/// jvm uses some unholy encoding internally so we convert it to utf-8 template < typename T, typename V > static T VisitStringAsStringView(JNIEnv* env, jobject str, V visit) @@ -19,10 +20,11 @@ VisitStringAsStringView(JNIEnv* env, jobject str, V visit) (jbyteArray)env->CallObjectMethod(str, getBytes, charsetName); env->DeleteLocalRef(charsetName); - const jsize length = env->GetArrayLength(stringJbytes); - const jbyte* pBytes = env->GetByteArrayElements(stringJbytes, NULL); + const size_t length = env->GetArrayLength(stringJbytes); + jbyte* pBytes = env->GetByteArrayElements(stringJbytes, NULL); - T result = visit(llarp::string_view(pBytes, length)); + T result = + visit(llarp::string_view(static_cast< const char* >(pBytes), length)); env->ReleaseByteArrayElements(stringJbytes, pBytes, JNI_ABORT); env->DeleteLocalRef(stringJbytes); @@ -65,13 +67,20 @@ VisitObjectMemberStringAsStringView(JNIEnv* env, jobject self, /// get object member int called membername template < typename Int_t > -void -GetObjectMemberAsInt(JNIEnv* env, jobject self, const char* membername, - Int_t& result) +Int_t +GetObjectMemberAsInt(JNIEnv* env, jobject self, const char* membername) { jclass cl = env->GetObjectClass(self); jfieldID name = env->GetFieldID(cl, membername, "I"); - result = env->GetIntField(self, name); + return env->GetIntField(self, name); +} + +/// get implementation on jni type +template < typename T > +T* +GetImpl(JNIEnv* env, jobject self) +{ + return FromObjectMember< T >(env, self, "impl"); } #endif \ No newline at end of file diff --git a/jni/lokinet_jni_vpnio.hpp b/jni/lokinet_jni_vpnio.hpp index f0b981cc5..30ca9f9b6 100644 --- a/jni/lokinet_jni_vpnio.hpp +++ b/jni/lokinet_jni_vpnio.hpp @@ -6,6 +6,7 @@ #include #include #include +#include namespace lokinet { @@ -27,7 +28,7 @@ namespace lokinet Closed() { if(closeWaiter) - closeWaiter->get_future().set_value(); + closeWaiter->set_value(); } virtual void @@ -57,19 +58,27 @@ namespace lokinet bool Init(llarp_main *ptr) { + if(Ready()) + return false; return llarp_vpn_io_init(ptr, &io); } + bool + Ready() const + { + return io.impl != nullptr; + } + void Close() { - if(io.impl == nullptr) + if(not Ready()) return; if(closeWaiter) return; - closerWaiter = std::make_unique< std::promise< void > >(); + closeWaiter = std::make_unique< std::promise< void > >(); llarp_vpn_io_close_async(&io); - closeWaiter->wait(); + closeWaiter->get_future().wait(); closeWaiter.reset(); io.impl = nullptr; } @@ -89,7 +98,7 @@ namespace lokinet ssize_t ReadPacket(void *dst, size_t len) { - if(io.impl == nullptr) + if(not Ready()) return -1; unsigned char *buf = (unsigned char *)dst; return llarp_vpn_io_readpkt(Reader(), buf, len); @@ -98,7 +107,7 @@ namespace lokinet bool WritePacket(void *pkt, size_t len) { - if(io.impl == nullptr) + if(not Ready()) return false; unsigned char *buf = (unsigned char *)pkt; return llarp_vpn_io_writepkt(Writer(), buf, len); diff --git a/jni/lokinet_vpn.cpp b/jni/lokinet_vpn.cpp index 8c8d39c1e..6febc606c 100644 --- a/jni/lokinet_vpn.cpp +++ b/jni/lokinet_vpn.cpp @@ -29,8 +29,7 @@ extern "C" JNIEXPORT void JNICALL Java_network_loki_lokinet_LokinetVPN_Stop(JNIEnv *env, jobject self) { - lokinet_jni_vpnio *vpn = - FromObjectMember< lokinet_jni_vpnio >(env, self, "impl"); + lokinet_jni_vpnio *vpn = GetImpl< lokinet_jni_vpnio >(env, self); if(vpn) { vpn->Close(); @@ -41,8 +40,7 @@ extern "C" Java_network_loki_lokinet_LokinetVPN_ReadPkt(JNIEnv *env, jobject self, jobject pkt) { - lokinet_jni_vpnio *vpn = - FromObjectMember< lokinet_jni_vpnio >(env, self, "impl"); + lokinet_jni_vpnio *vpn = GetImpl< lokinet_jni_vpnio >(env, self); if(vpn == nullptr) return -1; void *pktbuf = env->GetDirectBufferAddress(pkt); @@ -56,8 +54,7 @@ extern "C" Java_network_loki_lokinet_LokinetVPN_WritePkt(JNIEnv *env, jobject self, jobject pkt) { - lokinet_jni_vpnio *vpn = - FromObjectMember< lokinet_jni_vpnio >(env, self, "impl"); + lokinet_jni_vpnio *vpn = GetImpl< lokinet_jni_vpnio >(env, self); if(vpn == nullptr) return false; void *pktbuf = env->GetDirectBufferAddress(pkt); @@ -71,8 +68,7 @@ extern "C" Java_network_loki_lokinet_LokinetVPN_SetInfo(JNIEnv *env, jobject self, jobject info) { - lokinet_jni_vpnio *vpn = - FromObjectMember< lokinet_jni_vpnio >(env, self, "impl"); + lokinet_jni_vpnio *vpn = GetImpl< lokinet_jni_vpnio >(env, self); if(vpn == nullptr) return; VisitObjectMemberStringAsStringView< bool >( @@ -85,6 +81,6 @@ extern "C" vpn->SetIfName(val); return true; }); - GetObjectMemberAsInt(env, info, "netmask", vpn->info.netmask); + vpn->info.netmask = GetObjectMemberAsInt< uint8_t >(env, info, "netmask"); } } \ No newline at end of file