more fixups

pull/869/head
jeff 5 years ago
parent 4c584dd2da
commit bcf792d772

@ -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 >(

@ -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;

@ -6,6 +6,7 @@
#include <functional>
/// 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

@ -6,6 +6,7 @@
#include <future>
#include <util/string_view.hpp>
#include <algorithm>
#include <jni.h>
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);

@ -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");
}
}
Loading…
Cancel
Save