2015-08-28 12:35:04 -07:00
|
|
|
#include <jni.h>
|
2015-12-20 20:42:09 -08:00
|
|
|
#include <atomic>
|
2015-08-28 12:35:04 -07:00
|
|
|
#include <cassert>
|
2015-12-20 20:42:09 -08:00
|
|
|
#include <condition_variable>
|
|
|
|
|
#include <mutex>
|
2015-08-28 12:35:04 -07:00
|
|
|
#include <sstream>
|
2015-12-20 20:42:09 -08:00
|
|
|
#include <queue>
|
|
|
|
|
#include <thread>
|
2015-08-28 12:35:04 -07:00
|
|
|
|
|
|
|
|
#include "edu_wpi_first_wpilibj_networktables_NetworkTablesJNI.h"
|
|
|
|
|
#include "ntcore.h"
|
2016-07-27 00:39:38 -07:00
|
|
|
#include "support/atomic_static.h"
|
2016-09-25 19:29:17 -07:00
|
|
|
#include "support/jni_util.h"
|
2016-07-27 00:39:38 -07:00
|
|
|
#include "support/SafeThread.h"
|
2016-06-10 22:24:42 -04:00
|
|
|
#include "llvm/ConvertUTF.h"
|
|
|
|
|
#include "llvm/SmallString.h"
|
|
|
|
|
#include "llvm/SmallVector.h"
|
2015-08-28 12:35:04 -07:00
|
|
|
|
2016-09-25 19:29:17 -07:00
|
|
|
using namespace wpi::java;
|
|
|
|
|
|
2015-08-28 12:35:04 -07:00
|
|
|
//
|
|
|
|
|
// Globals and load/unload
|
|
|
|
|
//
|
|
|
|
|
|
|
|
|
|
// Used for callback.
|
2015-09-05 11:05:02 -07:00
|
|
|
static JavaVM *jvm = nullptr;
|
2016-12-14 23:16:09 -08:00
|
|
|
static JClass booleanCls;
|
|
|
|
|
static JClass doubleCls;
|
|
|
|
|
static JClass connectionInfoCls;
|
|
|
|
|
static JClass entryInfoCls;
|
2016-12-15 21:24:11 -08:00
|
|
|
static JException keyNotDefinedEx;
|
|
|
|
|
static JException persistentEx;
|
|
|
|
|
static JException illegalArgEx;
|
|
|
|
|
static JException nullPointerEx;
|
2015-12-20 20:42:09 -08:00
|
|
|
// Thread-attached environment for listener callbacks.
|
|
|
|
|
static JNIEnv *listenerEnv = nullptr;
|
|
|
|
|
|
|
|
|
|
static void ListenerOnStart() {
|
|
|
|
|
if (!jvm) return;
|
|
|
|
|
JNIEnv *env;
|
2015-12-28 08:28:24 -08:00
|
|
|
JavaVMAttachArgs args;
|
|
|
|
|
args.version = JNI_VERSION_1_2;
|
|
|
|
|
args.name = const_cast<char*>("NTListener");
|
|
|
|
|
args.group = nullptr;
|
|
|
|
|
if (jvm->AttachCurrentThreadAsDaemon(reinterpret_cast<void **>(&env),
|
|
|
|
|
&args) != JNI_OK)
|
2015-12-20 20:42:09 -08:00
|
|
|
return;
|
|
|
|
|
if (!env || !env->functions) return;
|
|
|
|
|
listenerEnv = env;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static void ListenerOnExit() {
|
|
|
|
|
listenerEnv = nullptr;
|
|
|
|
|
if (!jvm) return;
|
|
|
|
|
jvm->DetachCurrentThread();
|
|
|
|
|
}
|
2015-08-28 12:35:04 -07:00
|
|
|
|
2015-11-01 07:44:43 -08:00
|
|
|
extern "C" {
|
|
|
|
|
|
2015-08-28 13:52:16 -07:00
|
|
|
JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM *vm, void *reserved) {
|
2015-08-28 12:35:04 -07:00
|
|
|
jvm = vm;
|
|
|
|
|
|
|
|
|
|
JNIEnv *env;
|
|
|
|
|
if (vm->GetEnv(reinterpret_cast<void **>(&env), JNI_VERSION_1_6) != JNI_OK)
|
|
|
|
|
return JNI_ERR;
|
|
|
|
|
|
|
|
|
|
// Cache references to classes
|
2016-12-14 23:16:09 -08:00
|
|
|
booleanCls = JClass(env, "java/lang/Boolean");
|
2015-08-28 12:35:04 -07:00
|
|
|
if (!booleanCls) return JNI_ERR;
|
|
|
|
|
|
2016-12-14 23:16:09 -08:00
|
|
|
doubleCls = JClass(env, "java/lang/Double");
|
2015-08-28 12:35:04 -07:00
|
|
|
if (!doubleCls) return JNI_ERR;
|
|
|
|
|
|
2016-12-14 23:16:09 -08:00
|
|
|
connectionInfoCls =
|
|
|
|
|
JClass(env, "edu/wpi/first/wpilibj/networktables/ConnectionInfo");
|
2015-08-28 12:35:04 -07:00
|
|
|
if (!connectionInfoCls) return JNI_ERR;
|
|
|
|
|
|
2016-12-14 23:16:09 -08:00
|
|
|
entryInfoCls = JClass(env, "edu/wpi/first/wpilibj/networktables/EntryInfo");
|
2015-09-16 00:50:31 -07:00
|
|
|
if (!entryInfoCls) return JNI_ERR;
|
|
|
|
|
|
2016-12-15 21:24:11 -08:00
|
|
|
keyNotDefinedEx = JException(
|
2016-12-14 23:16:09 -08:00
|
|
|
env, "edu/wpi/first/wpilibj/networktables/NetworkTableKeyNotDefined");
|
2015-08-28 12:35:04 -07:00
|
|
|
if (!keyNotDefinedEx) return JNI_ERR;
|
|
|
|
|
|
2016-12-15 21:24:11 -08:00
|
|
|
persistentEx = JException(
|
|
|
|
|
env, "edu/wpi/first/wpilibj/networktables/PersistentException");
|
2015-08-28 12:35:04 -07:00
|
|
|
if (!persistentEx) return JNI_ERR;
|
|
|
|
|
|
2016-12-15 21:24:11 -08:00
|
|
|
illegalArgEx = JException(env, "java/lang/IllegalArgumentException");
|
2016-04-08 13:31:35 -07:00
|
|
|
if (!illegalArgEx) return JNI_ERR;
|
|
|
|
|
|
2016-12-15 21:24:11 -08:00
|
|
|
nullPointerEx = JException(env, "java/lang/NullPointerException");
|
2016-12-14 23:53:44 -08:00
|
|
|
if (!nullPointerEx) return JNI_ERR;
|
|
|
|
|
|
2015-12-20 20:42:09 -08:00
|
|
|
// Initial configuration of listener start/exit
|
|
|
|
|
nt::SetListenerOnStart(ListenerOnStart);
|
|
|
|
|
nt::SetListenerOnExit(ListenerOnExit);
|
|
|
|
|
|
2015-08-28 12:35:04 -07:00
|
|
|
return JNI_VERSION_1_6;
|
|
|
|
|
}
|
|
|
|
|
|
2015-08-28 13:52:16 -07:00
|
|
|
JNIEXPORT void JNICALL JNI_OnUnload(JavaVM *vm, void *reserved) {
|
2015-08-28 12:35:04 -07:00
|
|
|
JNIEnv *env;
|
|
|
|
|
if (vm->GetEnv(reinterpret_cast<void **>(&env), JNI_VERSION_1_6) != JNI_OK)
|
|
|
|
|
return;
|
|
|
|
|
// Delete global references
|
2016-12-14 23:16:09 -08:00
|
|
|
booleanCls.free(env);
|
|
|
|
|
doubleCls.free(env);
|
|
|
|
|
connectionInfoCls.free(env);
|
|
|
|
|
entryInfoCls.free(env);
|
|
|
|
|
keyNotDefinedEx.free(env);
|
|
|
|
|
persistentEx.free(env);
|
|
|
|
|
illegalArgEx.free(env);
|
2016-12-14 23:53:44 -08:00
|
|
|
nullPointerEx.free(env);
|
2015-09-05 11:05:02 -07:00
|
|
|
jvm = nullptr;
|
2015-08-28 12:35:04 -07:00
|
|
|
}
|
|
|
|
|
|
2015-11-01 07:44:43 -08:00
|
|
|
} // extern "C"
|
|
|
|
|
|
2015-08-28 12:35:04 -07:00
|
|
|
//
|
|
|
|
|
// Helper class to create and clean up a global reference
|
|
|
|
|
//
|
|
|
|
|
template <typename T>
|
2016-09-25 19:29:17 -07:00
|
|
|
class JGlobal {
|
2015-08-28 12:35:04 -07:00
|
|
|
public:
|
2016-09-25 19:29:17 -07:00
|
|
|
JGlobal(JNIEnv *env, T obj)
|
2015-08-28 12:35:04 -07:00
|
|
|
: m_obj(static_cast<T>(env->NewGlobalRef(obj))) {}
|
2016-09-25 19:29:17 -07:00
|
|
|
~JGlobal() {
|
2015-09-14 22:00:22 -07:00
|
|
|
if (!jvm || nt::NotifierDestroyed()) return;
|
2015-08-28 12:35:04 -07:00
|
|
|
JNIEnv *env;
|
2016-01-01 19:05:00 -08:00
|
|
|
bool attached = false;
|
|
|
|
|
// don't attach and de-attach if already attached to a thread.
|
|
|
|
|
if (jvm->GetEnv(reinterpret_cast<void **>(&env), JNI_VERSION_1_6) ==
|
|
|
|
|
JNI_EDETACHED) {
|
|
|
|
|
if (jvm->AttachCurrentThread(reinterpret_cast<void **>(&env), nullptr) !=
|
|
|
|
|
JNI_OK)
|
|
|
|
|
return;
|
|
|
|
|
attached = true;
|
|
|
|
|
}
|
2015-09-05 11:05:02 -07:00
|
|
|
if (!env || !env->functions) return;
|
2015-08-28 12:35:04 -07:00
|
|
|
env->DeleteGlobalRef(m_obj);
|
2016-01-01 19:05:00 -08:00
|
|
|
if (attached) jvm->DetachCurrentThread();
|
2015-08-28 12:35:04 -07:00
|
|
|
}
|
|
|
|
|
operator T() { return m_obj; }
|
|
|
|
|
T obj() { return m_obj; }
|
|
|
|
|
|
|
|
|
|
private:
|
|
|
|
|
T m_obj;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
//
|
|
|
|
|
// Helper class to create and clean up a weak global reference
|
|
|
|
|
//
|
|
|
|
|
template <typename T>
|
2016-09-25 19:29:17 -07:00
|
|
|
class JWeakGlobal {
|
2015-08-28 12:35:04 -07:00
|
|
|
public:
|
2016-09-25 19:29:17 -07:00
|
|
|
JWeakGlobal(JNIEnv *env, T obj)
|
2015-08-28 12:35:04 -07:00
|
|
|
: m_obj(static_cast<T>(env->NewWeakGlobalRef(obj))) {}
|
2016-09-25 19:29:17 -07:00
|
|
|
~JWeakGlobal() {
|
2015-09-14 22:00:22 -07:00
|
|
|
if (!jvm || nt::NotifierDestroyed()) return;
|
2015-08-28 12:35:04 -07:00
|
|
|
JNIEnv *env;
|
2016-01-01 19:05:00 -08:00
|
|
|
bool attached = false;
|
|
|
|
|
// don't attach and de-attach if already attached to a thread.
|
|
|
|
|
if (jvm->GetEnv(reinterpret_cast<void **>(&env), JNI_VERSION_1_6) ==
|
|
|
|
|
JNI_EDETACHED) {
|
|
|
|
|
if (jvm->AttachCurrentThread(reinterpret_cast<void **>(&env), nullptr) !=
|
|
|
|
|
JNI_OK)
|
|
|
|
|
return;
|
|
|
|
|
attached = true;
|
|
|
|
|
}
|
2015-09-05 11:05:02 -07:00
|
|
|
if (!env || !env->functions) return;
|
2015-08-28 12:35:04 -07:00
|
|
|
env->DeleteWeakGlobalRef(m_obj);
|
2016-01-01 19:05:00 -08:00
|
|
|
if (attached) jvm->DetachCurrentThread();
|
2015-08-28 12:35:04 -07:00
|
|
|
}
|
2016-09-25 19:29:17 -07:00
|
|
|
JLocal<T> obj(JNIEnv *env) {
|
|
|
|
|
return JLocal<T>{env, env->NewLocalRef(m_obj)};
|
2015-08-28 12:35:04 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private:
|
|
|
|
|
T m_obj;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
//
|
|
|
|
|
// Conversions from Java objects to C++
|
|
|
|
|
//
|
|
|
|
|
|
2016-09-25 19:29:17 -07:00
|
|
|
inline std::shared_ptr<nt::Value> FromJavaRaw(JNIEnv *env, jbyteArray jarr) {
|
|
|
|
|
CriticalJByteArrayRef ref{env, jarr};
|
|
|
|
|
if (!ref) return nullptr;
|
|
|
|
|
return nt::Value::MakeRaw(ref);
|
2015-08-28 12:35:04 -07:00
|
|
|
}
|
|
|
|
|
|
2016-09-25 19:29:17 -07:00
|
|
|
inline std::shared_ptr<nt::Value> FromJavaRawBB(JNIEnv *env, jobject jbb,
|
|
|
|
|
int len) {
|
|
|
|
|
JByteArrayRef ref{env, jbb, len};
|
|
|
|
|
if (!ref) return nullptr;
|
|
|
|
|
return nt::Value::MakeRaw(ref.str());
|
2015-11-20 01:22:26 -08:00
|
|
|
}
|
|
|
|
|
|
2016-09-25 19:29:17 -07:00
|
|
|
inline std::shared_ptr<nt::Value> FromJavaRpc(JNIEnv *env, jbyteArray jarr) {
|
|
|
|
|
CriticalJByteArrayRef ref{env, jarr};
|
|
|
|
|
if (!ref) return nullptr;
|
|
|
|
|
return nt::Value::MakeRpc(ref.str());
|
2015-08-28 12:35:04 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
std::shared_ptr<nt::Value> FromJavaBooleanArray(JNIEnv *env,
|
|
|
|
|
jbooleanArray jarr) {
|
2016-09-25 19:29:17 -07:00
|
|
|
CriticalJBooleanArrayRef ref{env, jarr};
|
|
|
|
|
if (!ref) return nullptr;
|
|
|
|
|
llvm::ArrayRef<jboolean> elements{ref};
|
|
|
|
|
size_t len = elements.size();
|
2015-08-28 12:35:04 -07:00
|
|
|
std::vector<int> arr;
|
|
|
|
|
arr.reserve(len);
|
|
|
|
|
for (size_t i = 0; i < len; ++i) arr.push_back(elements[i]);
|
|
|
|
|
return nt::Value::MakeBooleanArray(arr);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
std::shared_ptr<nt::Value> FromJavaDoubleArray(JNIEnv *env, jdoubleArray jarr) {
|
2016-09-25 19:29:17 -07:00
|
|
|
CriticalJDoubleArrayRef ref{env, jarr};
|
|
|
|
|
if (!ref) return nullptr;
|
|
|
|
|
return nt::Value::MakeDoubleArray(ref);
|
2015-08-28 12:35:04 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
std::shared_ptr<nt::Value> FromJavaStringArray(JNIEnv *env, jobjectArray jarr) {
|
|
|
|
|
size_t len = env->GetArrayLength(jarr);
|
|
|
|
|
std::vector<std::string> arr;
|
|
|
|
|
arr.reserve(len);
|
|
|
|
|
for (size_t i = 0; i < len; ++i) {
|
2016-09-25 19:29:17 -07:00
|
|
|
JLocal<jstring> elem{
|
|
|
|
|
env, static_cast<jstring>(env->GetObjectArrayElement(jarr, i))};
|
2015-08-28 12:35:04 -07:00
|
|
|
if (!elem) return nullptr;
|
2016-09-25 19:29:17 -07:00
|
|
|
arr.push_back(JStringRef{env, elem}.str());
|
2015-08-28 12:35:04 -07:00
|
|
|
}
|
|
|
|
|
return nt::Value::MakeStringArray(std::move(arr));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//
|
|
|
|
|
// Conversions from C++ to Java objects
|
|
|
|
|
//
|
|
|
|
|
|
2016-09-25 19:29:17 -07:00
|
|
|
static jobject MakeJObject(JNIEnv *env, const nt::Value& value) {
|
2015-08-28 12:35:04 -07:00
|
|
|
static jmethodID booleanConstructor = nullptr;
|
|
|
|
|
static jmethodID doubleConstructor = nullptr;
|
|
|
|
|
if (!booleanConstructor)
|
|
|
|
|
booleanConstructor = env->GetMethodID(booleanCls, "<init>", "(Z)V");
|
|
|
|
|
if (!doubleConstructor)
|
|
|
|
|
doubleConstructor = env->GetMethodID(doubleCls, "<init>", "(D)V");
|
|
|
|
|
|
|
|
|
|
switch (value.type()) {
|
|
|
|
|
case NT_BOOLEAN:
|
|
|
|
|
return env->NewObject(booleanCls, booleanConstructor,
|
|
|
|
|
(jboolean)(value.GetBoolean() ? 1 : 0));
|
|
|
|
|
case NT_DOUBLE:
|
|
|
|
|
return env->NewObject(doubleCls, doubleConstructor,
|
|
|
|
|
(jdouble)value.GetDouble());
|
|
|
|
|
case NT_STRING:
|
2016-09-25 19:29:17 -07:00
|
|
|
return MakeJString(env, value.GetString());
|
2015-08-28 12:35:04 -07:00
|
|
|
case NT_RAW:
|
2016-09-25 19:29:17 -07:00
|
|
|
return MakeJByteArray(env, value.GetRaw());
|
2015-08-28 12:35:04 -07:00
|
|
|
case NT_BOOLEAN_ARRAY:
|
2016-09-25 19:29:17 -07:00
|
|
|
return MakeJBooleanArray(env, value.GetBooleanArray());
|
2015-08-28 12:35:04 -07:00
|
|
|
case NT_DOUBLE_ARRAY:
|
2016-09-25 19:29:17 -07:00
|
|
|
return MakeJDoubleArray(env, value.GetDoubleArray());
|
2015-08-28 12:35:04 -07:00
|
|
|
case NT_STRING_ARRAY:
|
2016-09-25 19:29:17 -07:00
|
|
|
return MakeJStringArray(env, value.GetStringArray());
|
2015-08-28 12:35:04 -07:00
|
|
|
case NT_RPC:
|
2016-09-25 19:29:17 -07:00
|
|
|
return MakeJByteArray(env, value.GetRpc());
|
2015-08-28 12:35:04 -07:00
|
|
|
default:
|
|
|
|
|
return nullptr;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2016-09-25 19:29:17 -07:00
|
|
|
static jobject MakeJObject(JNIEnv *env, const nt::ConnectionInfo &info) {
|
2015-08-28 12:35:04 -07:00
|
|
|
static jmethodID constructor =
|
|
|
|
|
env->GetMethodID(connectionInfoCls, "<init>",
|
|
|
|
|
"(Ljava/lang/String;Ljava/lang/String;IJI)V");
|
2016-09-25 19:29:17 -07:00
|
|
|
JLocal<jstring> remote_id{env, MakeJString(env, info.remote_id)};
|
|
|
|
|
JLocal<jstring> remote_ip{env, MakeJString(env, info.remote_ip)};
|
2015-08-28 12:35:04 -07:00
|
|
|
return env->NewObject(connectionInfoCls, constructor, remote_id.obj(),
|
2016-08-07 14:38:20 -07:00
|
|
|
remote_ip.obj(), (jint)info.remote_port,
|
2015-08-28 12:35:04 -07:00
|
|
|
(jlong)info.last_update, (jint)info.protocol_version);
|
|
|
|
|
}
|
|
|
|
|
|
2016-09-25 19:29:17 -07:00
|
|
|
static jobject MakeJObject(JNIEnv *env, const nt::EntryInfo &info) {
|
2015-09-16 00:50:31 -07:00
|
|
|
static jmethodID constructor =
|
|
|
|
|
env->GetMethodID(entryInfoCls, "<init>", "(Ljava/lang/String;IIJ)V");
|
2016-09-25 19:29:17 -07:00
|
|
|
JLocal<jstring> name{env, MakeJString(env, info.name)};
|
2015-09-16 00:50:31 -07:00
|
|
|
return env->NewObject(entryInfoCls, constructor, name.obj(), (jint)info.type,
|
|
|
|
|
(jint)info.flags, (jlong)info.last_change);
|
|
|
|
|
}
|
|
|
|
|
|
2015-11-01 07:44:43 -08:00
|
|
|
extern "C" {
|
|
|
|
|
|
2015-08-28 12:35:04 -07:00
|
|
|
/*
|
|
|
|
|
* Class: edu_wpi_first_wpilibj_networktables_NetworkTablesJNI
|
|
|
|
|
* Method: containsKey
|
|
|
|
|
* Signature: (Ljava/lang/String;)Z
|
|
|
|
|
*/
|
|
|
|
|
JNIEXPORT jboolean JNICALL Java_edu_wpi_first_wpilibj_networktables_NetworkTablesJNI_containsKey
|
|
|
|
|
(JNIEnv *env, jclass, jstring key)
|
|
|
|
|
{
|
2016-12-14 23:53:44 -08:00
|
|
|
if (!key) {
|
2016-12-15 21:24:11 -08:00
|
|
|
nullPointerEx.Throw(env, "key cannot be null");
|
2016-12-14 23:53:44 -08:00
|
|
|
return false;
|
|
|
|
|
}
|
2016-09-25 19:29:17 -07:00
|
|
|
auto val = nt::GetEntryValue(JStringRef{env, key});
|
2015-08-28 12:35:04 -07:00
|
|
|
if (!val) return false;
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Class: edu_wpi_first_wpilibj_networktables_NetworkTablesJNI
|
|
|
|
|
* Method: getType
|
|
|
|
|
* Signature: (Ljava/lang/String;)I
|
|
|
|
|
*/
|
|
|
|
|
JNIEXPORT jint JNICALL Java_edu_wpi_first_wpilibj_networktables_NetworkTablesJNI_getType
|
|
|
|
|
(JNIEnv *env, jclass, jstring key)
|
|
|
|
|
{
|
2016-12-14 23:53:44 -08:00
|
|
|
if (!key) {
|
2016-12-15 21:24:11 -08:00
|
|
|
nullPointerEx.Throw(env, "key cannot be null");
|
2016-12-14 23:53:44 -08:00
|
|
|
return 0;
|
|
|
|
|
}
|
2016-09-25 19:29:17 -07:00
|
|
|
auto val = nt::GetEntryValue(JStringRef{env, key});
|
2015-08-28 12:35:04 -07:00
|
|
|
if (!val) return NT_UNASSIGNED;
|
|
|
|
|
return val->type();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Class: edu_wpi_first_wpilibj_networktables_NetworkTablesJNI
|
|
|
|
|
* Method: putBoolean
|
|
|
|
|
* Signature: (Ljava/lang/String;Z)Z
|
|
|
|
|
*/
|
|
|
|
|
JNIEXPORT jboolean JNICALL Java_edu_wpi_first_wpilibj_networktables_NetworkTablesJNI_putBoolean
|
|
|
|
|
(JNIEnv *env, jclass, jstring key, jboolean value)
|
|
|
|
|
{
|
2016-12-14 23:53:44 -08:00
|
|
|
if (!key) {
|
2016-12-15 21:24:11 -08:00
|
|
|
nullPointerEx.Throw(env, "key cannot be null");
|
2016-12-14 23:53:44 -08:00
|
|
|
return false;
|
|
|
|
|
}
|
2016-09-25 19:29:17 -07:00
|
|
|
return nt::SetEntryValue(JStringRef{env, key},
|
2015-08-28 14:07:51 -07:00
|
|
|
nt::Value::MakeBoolean(value != JNI_FALSE));
|
2015-08-28 12:35:04 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Class: edu_wpi_first_wpilibj_networktables_NetworkTablesJNI
|
|
|
|
|
* Method: putDouble
|
|
|
|
|
* Signature: (Ljava/lang/String;D)Z
|
|
|
|
|
*/
|
|
|
|
|
JNIEXPORT jboolean JNICALL Java_edu_wpi_first_wpilibj_networktables_NetworkTablesJNI_putDouble
|
|
|
|
|
(JNIEnv *env, jclass, jstring key, jdouble value)
|
|
|
|
|
{
|
2016-12-14 23:53:44 -08:00
|
|
|
if (!key) {
|
2016-12-15 21:24:11 -08:00
|
|
|
nullPointerEx.Throw(env, "key cannot be null");
|
2016-12-14 23:53:44 -08:00
|
|
|
return false;
|
|
|
|
|
}
|
2016-09-25 19:29:17 -07:00
|
|
|
return nt::SetEntryValue(JStringRef{env, key},
|
2015-08-28 12:35:04 -07:00
|
|
|
nt::Value::MakeDouble(value));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Class: edu_wpi_first_wpilibj_networktables_NetworkTablesJNI
|
|
|
|
|
* Method: putString
|
|
|
|
|
* Signature: (Ljava/lang/String;Ljava/lang/String;)Z
|
|
|
|
|
*/
|
|
|
|
|
JNIEXPORT jboolean JNICALL Java_edu_wpi_first_wpilibj_networktables_NetworkTablesJNI_putString
|
|
|
|
|
(JNIEnv *env, jclass, jstring key, jstring value)
|
|
|
|
|
{
|
2016-12-14 23:53:44 -08:00
|
|
|
if (!key) {
|
2016-12-15 21:24:11 -08:00
|
|
|
nullPointerEx.Throw(env, "key cannot be null");
|
2016-12-14 23:53:44 -08:00
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
if (!value) {
|
2016-12-15 21:24:11 -08:00
|
|
|
nullPointerEx.Throw(env, "value cannot be null");
|
2016-12-14 23:53:44 -08:00
|
|
|
return false;
|
|
|
|
|
}
|
2016-09-25 19:29:17 -07:00
|
|
|
return nt::SetEntryValue(JStringRef{env, key},
|
|
|
|
|
nt::Value::MakeString(JStringRef{env, value}));
|
2015-08-28 12:35:04 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Class: edu_wpi_first_wpilibj_networktables_NetworkTablesJNI
|
|
|
|
|
* Method: putRaw
|
|
|
|
|
* Signature: (Ljava/lang/String;[B)Z
|
|
|
|
|
*/
|
2015-11-20 01:22:26 -08:00
|
|
|
JNIEXPORT jboolean JNICALL Java_edu_wpi_first_wpilibj_networktables_NetworkTablesJNI_putRaw__Ljava_lang_String_2_3B
|
2015-08-28 12:35:04 -07:00
|
|
|
(JNIEnv *env, jclass, jstring key, jbyteArray value)
|
|
|
|
|
{
|
2016-12-14 23:53:44 -08:00
|
|
|
if (!key) {
|
2016-12-15 21:24:11 -08:00
|
|
|
nullPointerEx.Throw(env, "key cannot be null");
|
2016-12-14 23:53:44 -08:00
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
if (!value) {
|
2016-12-15 21:24:11 -08:00
|
|
|
nullPointerEx.Throw(env, "value cannot be null");
|
2016-12-14 23:53:44 -08:00
|
|
|
return false;
|
|
|
|
|
}
|
2015-08-28 12:35:04 -07:00
|
|
|
auto v = FromJavaRaw(env, value);
|
|
|
|
|
if (!v) return false;
|
2016-09-25 19:29:17 -07:00
|
|
|
return nt::SetEntryValue(JStringRef{env, key}, v);
|
2015-08-28 12:35:04 -07:00
|
|
|
}
|
|
|
|
|
|
2015-11-20 01:22:26 -08:00
|
|
|
/*
|
|
|
|
|
* Class: edu_wpi_first_wpilibj_networktables_NetworkTablesJNI
|
|
|
|
|
* Method: putRaw
|
|
|
|
|
* Signature: (Ljava/lang/String;Ljava/nio/ByteBuffer;I)Z
|
|
|
|
|
*/
|
|
|
|
|
JNIEXPORT jboolean JNICALL Java_edu_wpi_first_wpilibj_networktables_NetworkTablesJNI_putRaw__Ljava_lang_String_2Ljava_nio_ByteBuffer_2I
|
|
|
|
|
(JNIEnv *env, jclass, jstring key, jobject value, jint len)
|
|
|
|
|
{
|
2016-12-14 23:53:44 -08:00
|
|
|
if (!key) {
|
2016-12-15 21:24:11 -08:00
|
|
|
nullPointerEx.Throw(env, "key cannot be null");
|
2016-12-14 23:53:44 -08:00
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
if (!value) {
|
2016-12-15 21:24:11 -08:00
|
|
|
nullPointerEx.Throw(env, "value cannot be null");
|
2016-12-14 23:53:44 -08:00
|
|
|
return false;
|
|
|
|
|
}
|
2015-11-20 01:22:26 -08:00
|
|
|
auto v = FromJavaRawBB(env, value, len);
|
|
|
|
|
if (!v) return false;
|
2016-09-25 19:29:17 -07:00
|
|
|
return nt::SetEntryValue(JStringRef{env, key}, v);
|
2015-11-20 01:22:26 -08:00
|
|
|
}
|
|
|
|
|
|
2015-08-28 12:35:04 -07:00
|
|
|
/*
|
|
|
|
|
* Class: edu_wpi_first_wpilibj_networktables_NetworkTablesJNI
|
|
|
|
|
* Method: putBooleanArray
|
|
|
|
|
* Signature: (Ljava/lang/String;[Z)Z
|
|
|
|
|
*/
|
|
|
|
|
JNIEXPORT jboolean JNICALL Java_edu_wpi_first_wpilibj_networktables_NetworkTablesJNI_putBooleanArray
|
|
|
|
|
(JNIEnv *env, jclass, jstring key, jbooleanArray value)
|
|
|
|
|
{
|
2016-12-14 23:53:44 -08:00
|
|
|
if (!key) {
|
2016-12-15 21:24:11 -08:00
|
|
|
nullPointerEx.Throw(env, "key cannot be null");
|
2016-12-14 23:53:44 -08:00
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
if (!value) {
|
2016-12-15 21:24:11 -08:00
|
|
|
nullPointerEx.Throw(env, "value cannot be null");
|
2016-12-14 23:53:44 -08:00
|
|
|
return false;
|
|
|
|
|
}
|
2015-08-28 12:35:04 -07:00
|
|
|
auto v = FromJavaBooleanArray(env, value);
|
|
|
|
|
if (!v) return false;
|
2016-09-25 19:29:17 -07:00
|
|
|
return nt::SetEntryValue(JStringRef{env, key}, v);
|
2015-08-28 12:35:04 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Class: edu_wpi_first_wpilibj_networktables_NetworkTablesJNI
|
|
|
|
|
* Method: putDoubleArray
|
|
|
|
|
* Signature: (Ljava/lang/String;[D)Z
|
|
|
|
|
*/
|
|
|
|
|
JNIEXPORT jboolean JNICALL Java_edu_wpi_first_wpilibj_networktables_NetworkTablesJNI_putDoubleArray
|
|
|
|
|
(JNIEnv *env, jclass, jstring key, jdoubleArray value)
|
|
|
|
|
{
|
2016-12-14 23:53:44 -08:00
|
|
|
if (!key) {
|
2016-12-15 21:24:11 -08:00
|
|
|
nullPointerEx.Throw(env, "key cannot be null");
|
2016-12-14 23:53:44 -08:00
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
if (!value) {
|
2016-12-15 21:24:11 -08:00
|
|
|
nullPointerEx.Throw(env, "value cannot be null");
|
2016-12-14 23:53:44 -08:00
|
|
|
return false;
|
|
|
|
|
}
|
2015-08-28 12:35:04 -07:00
|
|
|
auto v = FromJavaDoubleArray(env, value);
|
|
|
|
|
if (!v) return false;
|
2016-09-25 19:29:17 -07:00
|
|
|
return nt::SetEntryValue(JStringRef{env, key}, v);
|
2015-08-28 12:35:04 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Class: edu_wpi_first_wpilibj_networktables_NetworkTablesJNI
|
|
|
|
|
* Method: putStringArray
|
|
|
|
|
* Signature: (Ljava/lang/String;[Ljava/lang/String;)Z
|
|
|
|
|
*/
|
|
|
|
|
JNIEXPORT jboolean JNICALL Java_edu_wpi_first_wpilibj_networktables_NetworkTablesJNI_putStringArray
|
|
|
|
|
(JNIEnv *env, jclass, jstring key, jobjectArray value)
|
|
|
|
|
{
|
2016-12-14 23:53:44 -08:00
|
|
|
if (!key) {
|
2016-12-15 21:24:11 -08:00
|
|
|
nullPointerEx.Throw(env, "key cannot be null");
|
2016-12-14 23:53:44 -08:00
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
if (!value) {
|
2016-12-15 21:24:11 -08:00
|
|
|
nullPointerEx.Throw(env, "value cannot be null");
|
2016-12-14 23:53:44 -08:00
|
|
|
return false;
|
|
|
|
|
}
|
2015-08-28 12:35:04 -07:00
|
|
|
auto v = FromJavaStringArray(env, value);
|
|
|
|
|
if (!v) return false;
|
2016-09-25 19:29:17 -07:00
|
|
|
return nt::SetEntryValue(JStringRef{env, key}, v);
|
2015-08-28 12:35:04 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Class: edu_wpi_first_wpilibj_networktables_NetworkTablesJNI
|
|
|
|
|
* Method: forcePutBoolean
|
|
|
|
|
* Signature: (Ljava/lang/String;Z)V
|
|
|
|
|
*/
|
|
|
|
|
JNIEXPORT void JNICALL Java_edu_wpi_first_wpilibj_networktables_NetworkTablesJNI_forcePutBoolean
|
|
|
|
|
(JNIEnv *env, jclass, jstring key, jboolean value)
|
|
|
|
|
{
|
2016-12-14 23:53:44 -08:00
|
|
|
if (!key) {
|
2016-12-15 21:24:11 -08:00
|
|
|
nullPointerEx.Throw(env, "key cannot be null");
|
2016-12-14 23:53:44 -08:00
|
|
|
return;
|
|
|
|
|
}
|
2016-09-25 19:29:17 -07:00
|
|
|
nt::SetEntryTypeValue(JStringRef{env, key},
|
|
|
|
|
nt::Value::MakeBoolean(value != JNI_FALSE));
|
2015-08-28 12:35:04 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Class: edu_wpi_first_wpilibj_networktables_NetworkTablesJNI
|
|
|
|
|
* Method: forcePutDouble
|
|
|
|
|
* Signature: (Ljava/lang/String;D)V
|
|
|
|
|
*/
|
|
|
|
|
JNIEXPORT void JNICALL Java_edu_wpi_first_wpilibj_networktables_NetworkTablesJNI_forcePutDouble
|
|
|
|
|
(JNIEnv *env, jclass, jstring key, jdouble value)
|
|
|
|
|
{
|
2016-12-14 23:53:44 -08:00
|
|
|
if (!key) {
|
2016-12-15 21:24:11 -08:00
|
|
|
nullPointerEx.Throw(env, "key cannot be null");
|
2016-12-14 23:53:44 -08:00
|
|
|
return;
|
|
|
|
|
}
|
2016-09-25 19:29:17 -07:00
|
|
|
nt::SetEntryTypeValue(JStringRef{env, key}, nt::Value::MakeDouble(value));
|
2015-08-28 12:35:04 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Class: edu_wpi_first_wpilibj_networktables_NetworkTablesJNI
|
|
|
|
|
* Method: forcePutString
|
|
|
|
|
* Signature: (Ljava/lang/String;Ljava/lang/String;)V
|
|
|
|
|
*/
|
|
|
|
|
JNIEXPORT void JNICALL Java_edu_wpi_first_wpilibj_networktables_NetworkTablesJNI_forcePutString
|
|
|
|
|
(JNIEnv *env, jclass, jstring key, jstring value)
|
|
|
|
|
{
|
2016-12-14 23:53:44 -08:00
|
|
|
if (!key) {
|
2016-12-15 21:24:11 -08:00
|
|
|
nullPointerEx.Throw(env, "key cannot be null");
|
2016-12-14 23:53:44 -08:00
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
if (!value) {
|
2016-12-15 21:24:11 -08:00
|
|
|
nullPointerEx.Throw(env, "value cannot be null");
|
2016-12-14 23:53:44 -08:00
|
|
|
return;
|
|
|
|
|
}
|
2016-09-25 19:29:17 -07:00
|
|
|
nt::SetEntryTypeValue(JStringRef{env, key},
|
|
|
|
|
nt::Value::MakeString(JStringRef{env, value}));
|
2015-08-28 12:35:04 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Class: edu_wpi_first_wpilibj_networktables_NetworkTablesJNI
|
|
|
|
|
* Method: forcePutRaw
|
|
|
|
|
* Signature: (Ljava/lang/String;[B)V
|
|
|
|
|
*/
|
2015-11-20 01:22:26 -08:00
|
|
|
JNIEXPORT void JNICALL Java_edu_wpi_first_wpilibj_networktables_NetworkTablesJNI_forcePutRaw__Ljava_lang_String_2_3B
|
2015-08-28 12:35:04 -07:00
|
|
|
(JNIEnv *env, jclass, jstring key, jbyteArray value)
|
|
|
|
|
{
|
2016-12-14 23:53:44 -08:00
|
|
|
if (!key) {
|
2016-12-15 21:24:11 -08:00
|
|
|
nullPointerEx.Throw(env, "key cannot be null");
|
2016-12-14 23:53:44 -08:00
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
if (!value) {
|
2016-12-15 21:24:11 -08:00
|
|
|
nullPointerEx.Throw(env, "value cannot be null");
|
2016-12-14 23:53:44 -08:00
|
|
|
return;
|
|
|
|
|
}
|
2015-08-28 12:35:04 -07:00
|
|
|
auto v = FromJavaRaw(env, value);
|
|
|
|
|
if (!v) return;
|
2016-09-25 19:29:17 -07:00
|
|
|
nt::SetEntryTypeValue(JStringRef{env, key}, v);
|
2015-08-28 12:35:04 -07:00
|
|
|
}
|
|
|
|
|
|
2015-11-20 01:22:26 -08:00
|
|
|
/*
|
|
|
|
|
* Class: edu_wpi_first_wpilibj_networktables_NetworkTablesJNI
|
|
|
|
|
* Method: forcePutRaw
|
|
|
|
|
* Signature: (Ljava/lang/String;Ljava/nio/ByteBuffer;I)V
|
|
|
|
|
*/
|
|
|
|
|
JNIEXPORT void JNICALL Java_edu_wpi_first_wpilibj_networktables_NetworkTablesJNI_forcePutRaw__Ljava_lang_String_2Ljava_nio_ByteBuffer_2I
|
|
|
|
|
(JNIEnv *env, jclass, jstring key, jobject value, jint len)
|
|
|
|
|
{
|
2016-12-14 23:53:44 -08:00
|
|
|
if (!key) {
|
2016-12-15 21:24:11 -08:00
|
|
|
nullPointerEx.Throw(env, "key cannot be null");
|
2016-12-14 23:53:44 -08:00
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
if (!value) {
|
2016-12-15 21:24:11 -08:00
|
|
|
nullPointerEx.Throw(env, "value cannot be null");
|
2016-12-14 23:53:44 -08:00
|
|
|
return;
|
|
|
|
|
}
|
2015-11-20 01:22:26 -08:00
|
|
|
auto v = FromJavaRawBB(env, value, len);
|
|
|
|
|
if (!v) return;
|
2016-09-25 19:29:17 -07:00
|
|
|
nt::SetEntryTypeValue(JStringRef{env, key}, v);
|
2015-11-20 01:22:26 -08:00
|
|
|
}
|
|
|
|
|
|
2015-08-28 12:35:04 -07:00
|
|
|
/*
|
|
|
|
|
* Class: edu_wpi_first_wpilibj_networktables_NetworkTablesJNI
|
|
|
|
|
* Method: forcePutBooleanArray
|
|
|
|
|
* Signature: (Ljava/lang/String;[Z)V
|
|
|
|
|
*/
|
|
|
|
|
JNIEXPORT void JNICALL Java_edu_wpi_first_wpilibj_networktables_NetworkTablesJNI_forcePutBooleanArray
|
|
|
|
|
(JNIEnv *env, jclass, jstring key, jbooleanArray value)
|
|
|
|
|
{
|
2016-12-14 23:53:44 -08:00
|
|
|
if (!key) {
|
2016-12-15 21:24:11 -08:00
|
|
|
nullPointerEx.Throw(env, "key cannot be null");
|
2016-12-14 23:53:44 -08:00
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
if (!value) {
|
2016-12-15 21:24:11 -08:00
|
|
|
nullPointerEx.Throw(env, "value cannot be null");
|
2016-12-14 23:53:44 -08:00
|
|
|
return;
|
|
|
|
|
}
|
2015-08-28 12:35:04 -07:00
|
|
|
auto v = FromJavaBooleanArray(env, value);
|
|
|
|
|
if (!v) return;
|
2016-09-25 19:29:17 -07:00
|
|
|
nt::SetEntryTypeValue(JStringRef{env, key}, v);
|
2015-08-28 12:35:04 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Class: edu_wpi_first_wpilibj_networktables_NetworkTablesJNI
|
|
|
|
|
* Method: forcePutDoubleArray
|
|
|
|
|
* Signature: (Ljava/lang/String;[D)V
|
|
|
|
|
*/
|
|
|
|
|
JNIEXPORT void JNICALL Java_edu_wpi_first_wpilibj_networktables_NetworkTablesJNI_forcePutDoubleArray
|
|
|
|
|
(JNIEnv *env, jclass, jstring key, jdoubleArray value)
|
|
|
|
|
{
|
2016-12-14 23:53:44 -08:00
|
|
|
if (!key) {
|
2016-12-15 21:24:11 -08:00
|
|
|
nullPointerEx.Throw(env, "key cannot be null");
|
2016-12-14 23:53:44 -08:00
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
if (!value) {
|
2016-12-15 21:24:11 -08:00
|
|
|
nullPointerEx.Throw(env, "value cannot be null");
|
2016-12-14 23:53:44 -08:00
|
|
|
return;
|
|
|
|
|
}
|
2015-08-28 12:35:04 -07:00
|
|
|
auto v = FromJavaDoubleArray(env, value);
|
|
|
|
|
if (!v) return;
|
2016-09-25 19:29:17 -07:00
|
|
|
nt::SetEntryTypeValue(JStringRef{env, key}, v);
|
2015-08-28 12:35:04 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Class: edu_wpi_first_wpilibj_networktables_NetworkTablesJNI
|
|
|
|
|
* Method: forcePutStringArray
|
|
|
|
|
* Signature: (Ljava/lang/String;[Ljava/lang/String;)V
|
|
|
|
|
*/
|
|
|
|
|
JNIEXPORT void JNICALL Java_edu_wpi_first_wpilibj_networktables_NetworkTablesJNI_forcePutStringArray
|
|
|
|
|
(JNIEnv *env, jclass, jstring key, jobjectArray value)
|
|
|
|
|
{
|
2016-12-14 23:53:44 -08:00
|
|
|
if (!key) {
|
2016-12-15 21:24:11 -08:00
|
|
|
nullPointerEx.Throw(env, "key cannot be null");
|
2016-12-14 23:53:44 -08:00
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
if (!value) {
|
2016-12-15 21:24:11 -08:00
|
|
|
nullPointerEx.Throw(env, "value cannot be null");
|
2016-12-14 23:53:44 -08:00
|
|
|
return;
|
|
|
|
|
}
|
2015-08-28 12:35:04 -07:00
|
|
|
auto v = FromJavaStringArray(env, value);
|
|
|
|
|
if (!v) return;
|
2016-09-25 19:29:17 -07:00
|
|
|
nt::SetEntryTypeValue(JStringRef{env, key}, v);
|
2015-08-28 12:35:04 -07:00
|
|
|
}
|
|
|
|
|
|
2015-08-28 13:52:16 -07:00
|
|
|
/*
|
|
|
|
|
* Class: edu_wpi_first_wpilibj_networktables_NetworkTablesJNI
|
|
|
|
|
* Method: getValue
|
|
|
|
|
* Signature: (Ljava/lang/String;)Ljava/lang/Object;
|
|
|
|
|
*/
|
|
|
|
|
JNIEXPORT jobject JNICALL Java_edu_wpi_first_wpilibj_networktables_NetworkTablesJNI_getValue__Ljava_lang_String_2
|
|
|
|
|
(JNIEnv *env, jclass, jstring key)
|
|
|
|
|
{
|
2016-12-14 23:53:44 -08:00
|
|
|
if (!key) {
|
2016-12-15 21:24:11 -08:00
|
|
|
nullPointerEx.Throw(env, "key cannot be null");
|
2016-12-14 23:53:44 -08:00
|
|
|
return nullptr;
|
|
|
|
|
}
|
2016-09-25 19:29:17 -07:00
|
|
|
auto val = nt::GetEntryValue(JStringRef{env, key});
|
2015-12-06 08:22:12 -08:00
|
|
|
if (!val) {
|
2016-12-15 21:24:11 -08:00
|
|
|
keyNotDefinedEx.Throw(env, key);
|
2015-08-28 17:17:20 -07:00
|
|
|
return nullptr;
|
2015-08-28 13:52:16 -07:00
|
|
|
}
|
2016-09-25 19:29:17 -07:00
|
|
|
return MakeJObject(env, *val);
|
2015-08-28 13:52:16 -07:00
|
|
|
}
|
|
|
|
|
|
2015-08-28 12:35:04 -07:00
|
|
|
/*
|
|
|
|
|
* Class: edu_wpi_first_wpilibj_networktables_NetworkTablesJNI
|
|
|
|
|
* Method: getBoolean
|
|
|
|
|
* Signature: (Ljava/lang/String;)Z
|
|
|
|
|
*/
|
|
|
|
|
JNIEXPORT jboolean JNICALL Java_edu_wpi_first_wpilibj_networktables_NetworkTablesJNI_getBoolean__Ljava_lang_String_2
|
|
|
|
|
(JNIEnv *env, jclass, jstring key)
|
|
|
|
|
{
|
2016-12-14 23:53:44 -08:00
|
|
|
if (!key) {
|
2016-12-15 21:24:11 -08:00
|
|
|
nullPointerEx.Throw(env, "key cannot be null");
|
2016-12-14 23:53:44 -08:00
|
|
|
return false;
|
|
|
|
|
}
|
2016-09-25 19:29:17 -07:00
|
|
|
auto val = nt::GetEntryValue(JStringRef{env, key});
|
2015-08-28 12:35:04 -07:00
|
|
|
if (!val || !val->IsBoolean()) {
|
2016-12-15 21:24:11 -08:00
|
|
|
keyNotDefinedEx.Throw(env, key);
|
2015-08-28 12:35:04 -07:00
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
return val->GetBoolean();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Class: edu_wpi_first_wpilibj_networktables_NetworkTablesJNI
|
|
|
|
|
* Method: getDouble
|
|
|
|
|
* Signature: (Ljava/lang/String;)D
|
|
|
|
|
*/
|
|
|
|
|
JNIEXPORT jdouble JNICALL Java_edu_wpi_first_wpilibj_networktables_NetworkTablesJNI_getDouble__Ljava_lang_String_2
|
|
|
|
|
(JNIEnv *env, jclass, jstring key)
|
|
|
|
|
{
|
2016-12-14 23:53:44 -08:00
|
|
|
if (!key) {
|
2016-12-15 21:24:11 -08:00
|
|
|
nullPointerEx.Throw(env, "key cannot be null");
|
2016-12-14 23:53:44 -08:00
|
|
|
return 0;
|
|
|
|
|
}
|
2016-09-25 19:29:17 -07:00
|
|
|
auto val = nt::GetEntryValue(JStringRef{env, key});
|
2015-08-28 12:35:04 -07:00
|
|
|
if (!val || !val->IsDouble()) {
|
2016-12-15 21:24:11 -08:00
|
|
|
keyNotDefinedEx.Throw(env, key);
|
2015-08-28 12:35:04 -07:00
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
return val->GetDouble();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Class: edu_wpi_first_wpilibj_networktables_NetworkTablesJNI
|
|
|
|
|
* Method: getString
|
|
|
|
|
* Signature: (Ljava/lang/String;)Ljava/lang/String;
|
|
|
|
|
*/
|
|
|
|
|
JNIEXPORT jstring JNICALL Java_edu_wpi_first_wpilibj_networktables_NetworkTablesJNI_getString__Ljava_lang_String_2
|
|
|
|
|
(JNIEnv *env, jclass, jstring key)
|
|
|
|
|
{
|
2016-12-14 23:53:44 -08:00
|
|
|
if (!key) {
|
2016-12-15 21:24:11 -08:00
|
|
|
nullPointerEx.Throw(env, "key cannot be null");
|
2016-12-14 23:53:44 -08:00
|
|
|
return nullptr;
|
|
|
|
|
}
|
2016-09-25 19:29:17 -07:00
|
|
|
auto val = nt::GetEntryValue(JStringRef{env, key});
|
2015-08-28 12:35:04 -07:00
|
|
|
if (!val || !val->IsString()) {
|
2016-12-15 21:24:11 -08:00
|
|
|
keyNotDefinedEx.Throw(env, key);
|
2015-08-28 12:35:04 -07:00
|
|
|
return nullptr;
|
|
|
|
|
}
|
2016-09-25 19:29:17 -07:00
|
|
|
return MakeJString(env, val->GetString());
|
2015-08-28 12:35:04 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Class: edu_wpi_first_wpilibj_networktables_NetworkTablesJNI
|
|
|
|
|
* Method: getRaw
|
|
|
|
|
* Signature: (Ljava/lang/String;)[B
|
|
|
|
|
*/
|
|
|
|
|
JNIEXPORT jbyteArray JNICALL Java_edu_wpi_first_wpilibj_networktables_NetworkTablesJNI_getRaw__Ljava_lang_String_2
|
|
|
|
|
(JNIEnv *env, jclass, jstring key)
|
|
|
|
|
{
|
2016-12-14 23:53:44 -08:00
|
|
|
if (!key) {
|
2016-12-15 21:24:11 -08:00
|
|
|
nullPointerEx.Throw(env, "key cannot be null");
|
2016-12-14 23:53:44 -08:00
|
|
|
return nullptr;
|
|
|
|
|
}
|
2016-09-25 19:29:17 -07:00
|
|
|
auto val = nt::GetEntryValue(JStringRef{env, key});
|
2015-08-28 12:35:04 -07:00
|
|
|
if (!val || !val->IsRaw()) {
|
2016-12-15 21:24:11 -08:00
|
|
|
keyNotDefinedEx.Throw(env, key);
|
2015-08-28 12:35:04 -07:00
|
|
|
return nullptr;
|
|
|
|
|
}
|
2016-09-25 19:29:17 -07:00
|
|
|
return MakeJByteArray(env, val->GetRaw());
|
2015-08-28 12:35:04 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Class: edu_wpi_first_wpilibj_networktables_NetworkTablesJNI
|
|
|
|
|
* Method: getBooleanArray
|
|
|
|
|
* Signature: (Ljava/lang/String;)[Z
|
|
|
|
|
*/
|
|
|
|
|
JNIEXPORT jbooleanArray JNICALL Java_edu_wpi_first_wpilibj_networktables_NetworkTablesJNI_getBooleanArray__Ljava_lang_String_2
|
|
|
|
|
(JNIEnv *env, jclass, jstring key)
|
|
|
|
|
{
|
2016-12-14 23:53:44 -08:00
|
|
|
if (!key) {
|
2016-12-15 21:24:11 -08:00
|
|
|
nullPointerEx.Throw(env, "key cannot be null");
|
2016-12-14 23:53:44 -08:00
|
|
|
return nullptr;
|
|
|
|
|
}
|
2016-09-25 19:29:17 -07:00
|
|
|
auto val = nt::GetEntryValue(JStringRef{env, key});
|
2015-08-28 12:35:04 -07:00
|
|
|
if (!val || !val->IsBooleanArray()) {
|
2016-12-15 21:24:11 -08:00
|
|
|
keyNotDefinedEx.Throw(env, key);
|
2015-08-28 12:35:04 -07:00
|
|
|
return nullptr;
|
|
|
|
|
}
|
2016-09-25 19:29:17 -07:00
|
|
|
return MakeJBooleanArray(env, val->GetBooleanArray());
|
2015-08-28 12:35:04 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Class: edu_wpi_first_wpilibj_networktables_NetworkTablesJNI
|
|
|
|
|
* Method: getDoubleArray
|
|
|
|
|
* Signature: (Ljava/lang/String;)[D
|
|
|
|
|
*/
|
|
|
|
|
JNIEXPORT jdoubleArray JNICALL Java_edu_wpi_first_wpilibj_networktables_NetworkTablesJNI_getDoubleArray__Ljava_lang_String_2
|
|
|
|
|
(JNIEnv *env, jclass, jstring key)
|
|
|
|
|
{
|
2016-12-14 23:53:44 -08:00
|
|
|
if (!key) {
|
2016-12-15 21:24:11 -08:00
|
|
|
nullPointerEx.Throw(env, "key cannot be null");
|
2016-12-14 23:53:44 -08:00
|
|
|
return nullptr;
|
|
|
|
|
}
|
2016-09-25 19:29:17 -07:00
|
|
|
auto val = nt::GetEntryValue(JStringRef{env, key});
|
2015-08-28 12:35:04 -07:00
|
|
|
if (!val || !val->IsDoubleArray()) {
|
2016-12-15 21:24:11 -08:00
|
|
|
keyNotDefinedEx.Throw(env, key);
|
2015-08-28 12:35:04 -07:00
|
|
|
return nullptr;
|
|
|
|
|
}
|
2016-09-25 19:29:17 -07:00
|
|
|
return MakeJDoubleArray(env, val->GetDoubleArray());
|
2015-08-28 12:35:04 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Class: edu_wpi_first_wpilibj_networktables_NetworkTablesJNI
|
|
|
|
|
* Method: getStringArray
|
|
|
|
|
* Signature: (Ljava/lang/String;)[Ljava/lang/String;
|
|
|
|
|
*/
|
|
|
|
|
JNIEXPORT jobjectArray JNICALL Java_edu_wpi_first_wpilibj_networktables_NetworkTablesJNI_getStringArray__Ljava_lang_String_2
|
|
|
|
|
(JNIEnv *env, jclass, jstring key)
|
|
|
|
|
{
|
2016-12-14 23:53:44 -08:00
|
|
|
if (!key) {
|
2016-12-15 21:24:11 -08:00
|
|
|
nullPointerEx.Throw(env, "key cannot be null");
|
2016-12-14 23:53:44 -08:00
|
|
|
return nullptr;
|
|
|
|
|
}
|
2016-09-25 19:29:17 -07:00
|
|
|
auto val = nt::GetEntryValue(JStringRef{env, key});
|
2015-08-28 12:35:04 -07:00
|
|
|
if (!val || !val->IsStringArray()) {
|
2016-12-15 21:24:11 -08:00
|
|
|
keyNotDefinedEx.Throw(env, key);
|
2015-08-28 12:35:04 -07:00
|
|
|
return nullptr;
|
|
|
|
|
}
|
2016-09-25 19:29:17 -07:00
|
|
|
return MakeJStringArray(env, val->GetStringArray());
|
2015-08-28 12:35:04 -07:00
|
|
|
}
|
|
|
|
|
|
2015-08-28 13:52:16 -07:00
|
|
|
/*
|
|
|
|
|
* Class: edu_wpi_first_wpilibj_networktables_NetworkTablesJNI
|
|
|
|
|
* Method: getValue
|
|
|
|
|
* Signature: (Ljava/lang/String;Ljava/lang/Object;)Ljava/lang/Object;
|
|
|
|
|
*/
|
|
|
|
|
JNIEXPORT jobject JNICALL Java_edu_wpi_first_wpilibj_networktables_NetworkTablesJNI_getValue__Ljava_lang_String_2Ljava_lang_Object_2
|
|
|
|
|
(JNIEnv *env, jclass, jstring key, jobject defaultValue)
|
|
|
|
|
{
|
2016-12-14 23:53:44 -08:00
|
|
|
if (!key) {
|
2016-12-15 21:24:11 -08:00
|
|
|
nullPointerEx.Throw(env, "key cannot be null");
|
2016-12-14 23:53:44 -08:00
|
|
|
return nullptr;
|
|
|
|
|
}
|
2016-09-25 19:29:17 -07:00
|
|
|
auto val = nt::GetEntryValue(JStringRef{env, key});
|
2015-12-06 08:22:12 -08:00
|
|
|
if (!val) return defaultValue;
|
2016-09-25 19:29:17 -07:00
|
|
|
return MakeJObject(env, *val);
|
2015-08-28 13:52:16 -07:00
|
|
|
}
|
|
|
|
|
|
2015-08-28 12:35:04 -07:00
|
|
|
/*
|
|
|
|
|
* Class: edu_wpi_first_wpilibj_networktables_NetworkTablesJNI
|
|
|
|
|
* Method: getBoolean
|
|
|
|
|
* Signature: (Ljava/lang/String;Z)Z
|
|
|
|
|
*/
|
|
|
|
|
JNIEXPORT jboolean JNICALL Java_edu_wpi_first_wpilibj_networktables_NetworkTablesJNI_getBoolean__Ljava_lang_String_2Z
|
|
|
|
|
(JNIEnv *env, jclass, jstring key, jboolean defaultValue)
|
|
|
|
|
{
|
2016-12-14 23:53:44 -08:00
|
|
|
if (!key) {
|
2016-12-15 21:24:11 -08:00
|
|
|
nullPointerEx.Throw(env, "key cannot be null");
|
2016-12-14 23:53:44 -08:00
|
|
|
return false;
|
|
|
|
|
}
|
2016-09-25 19:29:17 -07:00
|
|
|
auto val = nt::GetEntryValue(JStringRef{env, key});
|
2015-08-28 12:35:04 -07:00
|
|
|
if (!val || !val->IsBoolean()) return defaultValue;
|
|
|
|
|
return val->GetBoolean();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Class: edu_wpi_first_wpilibj_networktables_NetworkTablesJNI
|
|
|
|
|
* Method: getDouble
|
|
|
|
|
* Signature: (Ljava/lang/String;D)D
|
|
|
|
|
*/
|
|
|
|
|
JNIEXPORT jdouble JNICALL Java_edu_wpi_first_wpilibj_networktables_NetworkTablesJNI_getDouble__Ljava_lang_String_2D
|
|
|
|
|
(JNIEnv *env, jclass, jstring key, jdouble defaultValue)
|
|
|
|
|
{
|
2016-12-14 23:53:44 -08:00
|
|
|
if (!key) {
|
2016-12-15 21:24:11 -08:00
|
|
|
nullPointerEx.Throw(env, "key cannot be null");
|
2016-12-14 23:53:44 -08:00
|
|
|
return 0;
|
|
|
|
|
}
|
2016-09-25 19:29:17 -07:00
|
|
|
auto val = nt::GetEntryValue(JStringRef{env, key});
|
2015-08-28 12:35:04 -07:00
|
|
|
if (!val || !val->IsDouble()) return defaultValue;
|
|
|
|
|
return val->GetDouble();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Class: edu_wpi_first_wpilibj_networktables_NetworkTablesJNI
|
|
|
|
|
* Method: getString
|
|
|
|
|
* Signature: (Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
|
|
|
|
|
*/
|
|
|
|
|
JNIEXPORT jstring JNICALL Java_edu_wpi_first_wpilibj_networktables_NetworkTablesJNI_getString__Ljava_lang_String_2Ljava_lang_String_2
|
|
|
|
|
(JNIEnv *env, jclass, jstring key, jstring defaultValue)
|
|
|
|
|
{
|
2016-12-14 23:53:44 -08:00
|
|
|
if (!key) {
|
2016-12-15 21:24:11 -08:00
|
|
|
nullPointerEx.Throw(env, "key cannot be null");
|
2016-12-14 23:53:44 -08:00
|
|
|
return nullptr;
|
|
|
|
|
}
|
2016-09-25 19:29:17 -07:00
|
|
|
auto val = nt::GetEntryValue(JStringRef{env, key});
|
2015-08-28 12:35:04 -07:00
|
|
|
if (!val || !val->IsString()) return defaultValue;
|
2016-09-25 19:29:17 -07:00
|
|
|
return MakeJString(env, val->GetString());
|
2015-08-28 12:35:04 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Class: edu_wpi_first_wpilibj_networktables_NetworkTablesJNI
|
|
|
|
|
* Method: getRaw
|
|
|
|
|
* Signature: (Ljava/lang/String;[B)[B
|
|
|
|
|
*/
|
|
|
|
|
JNIEXPORT jbyteArray JNICALL Java_edu_wpi_first_wpilibj_networktables_NetworkTablesJNI_getRaw__Ljava_lang_String_2_3B
|
|
|
|
|
(JNIEnv *env, jclass, jstring key, jbyteArray defaultValue)
|
|
|
|
|
{
|
2016-12-14 23:53:44 -08:00
|
|
|
if (!key) {
|
2016-12-15 21:24:11 -08:00
|
|
|
nullPointerEx.Throw(env, "key cannot be null");
|
2016-12-14 23:53:44 -08:00
|
|
|
return nullptr;
|
|
|
|
|
}
|
2016-09-25 19:29:17 -07:00
|
|
|
auto val = nt::GetEntryValue(JStringRef{env, key});
|
2015-08-28 12:35:04 -07:00
|
|
|
if (!val || !val->IsRaw()) return defaultValue;
|
2016-09-25 19:29:17 -07:00
|
|
|
return MakeJByteArray(env, val->GetRaw());
|
2015-08-28 12:35:04 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Class: edu_wpi_first_wpilibj_networktables_NetworkTablesJNI
|
|
|
|
|
* Method: getBooleanArray
|
|
|
|
|
* Signature: (Ljava/lang/String;[Z)[Z
|
|
|
|
|
*/
|
|
|
|
|
JNIEXPORT jbooleanArray JNICALL Java_edu_wpi_first_wpilibj_networktables_NetworkTablesJNI_getBooleanArray__Ljava_lang_String_2_3Z
|
|
|
|
|
(JNIEnv *env, jclass, jstring key, jbooleanArray defaultValue)
|
|
|
|
|
{
|
2016-12-14 23:53:44 -08:00
|
|
|
if (!key) {
|
2016-12-15 21:24:11 -08:00
|
|
|
nullPointerEx.Throw(env, "key cannot be null");
|
2016-12-14 23:53:44 -08:00
|
|
|
return nullptr;
|
|
|
|
|
}
|
2016-09-25 19:29:17 -07:00
|
|
|
auto val = nt::GetEntryValue(JStringRef{env, key});
|
2015-08-28 12:35:04 -07:00
|
|
|
if (!val || !val->IsBooleanArray()) return defaultValue;
|
2016-09-25 19:29:17 -07:00
|
|
|
return MakeJBooleanArray(env, val->GetBooleanArray());
|
2015-08-28 12:35:04 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Class: edu_wpi_first_wpilibj_networktables_NetworkTablesJNI
|
|
|
|
|
* Method: getDoubleArray
|
|
|
|
|
* Signature: (Ljava/lang/String;[D)[D
|
|
|
|
|
*/
|
|
|
|
|
JNIEXPORT jdoubleArray JNICALL Java_edu_wpi_first_wpilibj_networktables_NetworkTablesJNI_getDoubleArray__Ljava_lang_String_2_3D
|
|
|
|
|
(JNIEnv *env, jclass, jstring key, jdoubleArray defaultValue)
|
|
|
|
|
{
|
2016-12-14 23:53:44 -08:00
|
|
|
if (!key) {
|
2016-12-15 21:24:11 -08:00
|
|
|
nullPointerEx.Throw(env, "key cannot be null");
|
2016-12-14 23:53:44 -08:00
|
|
|
return nullptr;
|
|
|
|
|
}
|
2016-09-25 19:29:17 -07:00
|
|
|
auto val = nt::GetEntryValue(JStringRef{env, key});
|
2015-08-28 12:35:04 -07:00
|
|
|
if (!val || !val->IsDoubleArray()) return defaultValue;
|
2016-09-25 19:29:17 -07:00
|
|
|
return MakeJDoubleArray(env, val->GetDoubleArray());
|
2015-08-28 12:35:04 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Class: edu_wpi_first_wpilibj_networktables_NetworkTablesJNI
|
|
|
|
|
* Method: getStringArray
|
|
|
|
|
* Signature: (Ljava/lang/String;[Ljava/lang/String;)[Ljava/lang/String;
|
|
|
|
|
*/
|
|
|
|
|
JNIEXPORT jobjectArray JNICALL Java_edu_wpi_first_wpilibj_networktables_NetworkTablesJNI_getStringArray__Ljava_lang_String_2_3Ljava_lang_String_2
|
|
|
|
|
(JNIEnv *env, jclass, jstring key, jobjectArray defaultValue)
|
|
|
|
|
{
|
2016-12-14 23:53:44 -08:00
|
|
|
if (!key) {
|
2016-12-15 21:24:11 -08:00
|
|
|
nullPointerEx.Throw(env, "key cannot be null");
|
2016-12-14 23:53:44 -08:00
|
|
|
return nullptr;
|
|
|
|
|
}
|
2016-09-25 19:29:17 -07:00
|
|
|
auto val = nt::GetEntryValue(JStringRef{env, key});
|
2015-08-28 12:35:04 -07:00
|
|
|
if (!val || !val->IsStringArray()) return defaultValue;
|
2016-09-25 19:29:17 -07:00
|
|
|
return MakeJStringArray(env, val->GetStringArray());
|
2015-08-28 12:35:04 -07:00
|
|
|
}
|
|
|
|
|
|
2016-07-13 00:31:03 -07:00
|
|
|
/*
|
|
|
|
|
* Class: edu_wpi_first_wpilibj_networktables_NetworkTablesJNI
|
|
|
|
|
* Method: setDefaultBoolean
|
|
|
|
|
* Signature: (Ljava/lang/String;Z)Z
|
|
|
|
|
*/
|
|
|
|
|
JNIEXPORT jboolean JNICALL Java_edu_wpi_first_wpilibj_networktables_NetworkTablesJNI_setDefaultBoolean
|
|
|
|
|
(JNIEnv *env, jclass, jstring key, jboolean defaultValue)
|
|
|
|
|
{
|
2016-12-14 23:53:44 -08:00
|
|
|
if (!key) {
|
2016-12-15 21:24:11 -08:00
|
|
|
nullPointerEx.Throw(env, "key cannot be null");
|
2016-12-14 23:53:44 -08:00
|
|
|
return false;
|
|
|
|
|
}
|
2016-09-25 19:29:17 -07:00
|
|
|
return nt::SetDefaultEntryValue(JStringRef{env, key},
|
2016-07-13 00:31:03 -07:00
|
|
|
nt::Value::MakeBoolean(defaultValue != JNI_FALSE));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Class: edu_wpi_first_wpilibj_networktables_NetworkTablesJNI
|
|
|
|
|
* Method: setDefaultDouble
|
|
|
|
|
* Signature: (Ljava/lang/String;D)Z
|
|
|
|
|
*/
|
|
|
|
|
JNIEXPORT jboolean JNICALL Java_edu_wpi_first_wpilibj_networktables_NetworkTablesJNI_setDefaultDouble
|
|
|
|
|
(JNIEnv *env, jclass, jstring key, jdouble defaultValue)
|
|
|
|
|
{
|
2016-12-14 23:53:44 -08:00
|
|
|
if (!key) {
|
2016-12-15 21:24:11 -08:00
|
|
|
nullPointerEx.Throw(env, "key cannot be null");
|
2016-12-14 23:53:44 -08:00
|
|
|
return 0;
|
|
|
|
|
}
|
2016-09-25 19:29:17 -07:00
|
|
|
return nt::SetDefaultEntryValue(JStringRef{env, key},
|
2016-07-13 00:31:03 -07:00
|
|
|
nt::Value::MakeDouble(defaultValue));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Class: edu_wpi_first_wpilibj_networktables_NetworkTablesJNI
|
|
|
|
|
* Method: setDefaultString
|
|
|
|
|
* Signature: (Ljava/lang/String;Ljava/lang/String;)Z
|
|
|
|
|
*/
|
|
|
|
|
JNIEXPORT jboolean JNICALL Java_edu_wpi_first_wpilibj_networktables_NetworkTablesJNI_setDefaultString
|
|
|
|
|
(JNIEnv *env, jclass, jstring key, jstring defaultValue)
|
|
|
|
|
{
|
2016-12-14 23:53:44 -08:00
|
|
|
if (!key) {
|
2016-12-15 21:24:11 -08:00
|
|
|
nullPointerEx.Throw(env, "key cannot be null");
|
2016-12-14 23:53:44 -08:00
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
if (!defaultValue) {
|
2016-12-15 21:24:11 -08:00
|
|
|
nullPointerEx.Throw(env, "defaultValue cannot be null");
|
2016-12-14 23:53:44 -08:00
|
|
|
return false;
|
|
|
|
|
}
|
2016-09-25 19:29:17 -07:00
|
|
|
return nt::SetDefaultEntryValue(
|
|
|
|
|
JStringRef{env, key},
|
|
|
|
|
nt::Value::MakeString(JStringRef{env, defaultValue}));
|
2016-07-13 00:31:03 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Class: edu_wpi_first_wpilibj_networktables_NetworkTablesJNI
|
|
|
|
|
* Method: setDefaultRaw
|
|
|
|
|
* Signature: (Ljava/lang/String;[B)Z
|
|
|
|
|
*/
|
|
|
|
|
JNIEXPORT jboolean JNICALL Java_edu_wpi_first_wpilibj_networktables_NetworkTablesJNI_setDefaultRaw
|
|
|
|
|
(JNIEnv *env, jclass, jstring key, jbyteArray defaultValue)
|
|
|
|
|
{
|
2016-12-14 23:53:44 -08:00
|
|
|
if (!key) {
|
2016-12-15 21:24:11 -08:00
|
|
|
nullPointerEx.Throw(env, "key cannot be null");
|
2016-12-14 23:53:44 -08:00
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
if (!defaultValue) {
|
2016-12-15 21:24:11 -08:00
|
|
|
nullPointerEx.Throw(env, "defaultValue cannot be null");
|
2016-12-14 23:53:44 -08:00
|
|
|
return false;
|
|
|
|
|
}
|
2016-07-13 00:31:03 -07:00
|
|
|
auto v = FromJavaRaw(env, defaultValue);
|
2016-09-25 19:29:17 -07:00
|
|
|
return nt::SetDefaultEntryValue(JStringRef{env, key}, v);
|
2016-07-13 00:31:03 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Class: edu_wpi_first_wpilibj_networktables_NetworkTablesJNI
|
|
|
|
|
* Method: setDefaultBooleanArray
|
|
|
|
|
* Signature: (Ljava/lang/String;[Z)Z
|
|
|
|
|
*/
|
|
|
|
|
JNIEXPORT jboolean JNICALL Java_edu_wpi_first_wpilibj_networktables_NetworkTablesJNI_setDefaultBooleanArray
|
|
|
|
|
(JNIEnv *env, jclass, jstring key, jbooleanArray defaultValue)
|
|
|
|
|
{
|
2016-12-14 23:53:44 -08:00
|
|
|
if (!key) {
|
2016-12-15 21:24:11 -08:00
|
|
|
nullPointerEx.Throw(env, "key cannot be null");
|
2016-12-14 23:53:44 -08:00
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
if (!defaultValue) {
|
2016-12-15 21:24:11 -08:00
|
|
|
nullPointerEx.Throw(env, "defaultValue cannot be null");
|
2016-12-14 23:53:44 -08:00
|
|
|
return false;
|
|
|
|
|
}
|
2016-07-13 00:31:03 -07:00
|
|
|
auto v = FromJavaBooleanArray(env, defaultValue);
|
2016-09-25 19:29:17 -07:00
|
|
|
return nt::SetDefaultEntryValue(JStringRef{env, key}, v);
|
2016-07-13 00:31:03 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Class: edu_wpi_first_wpilibj_networktables_NetworkTablesJNI
|
|
|
|
|
* Method: setDefaultDoubleArray
|
|
|
|
|
* Signature: (Ljava/lang/String;[D)Z
|
|
|
|
|
*/
|
|
|
|
|
JNIEXPORT jboolean JNICALL Java_edu_wpi_first_wpilibj_networktables_NetworkTablesJNI_setDefaultDoubleArray
|
|
|
|
|
(JNIEnv *env, jclass, jstring key, jdoubleArray defaultValue)
|
|
|
|
|
{
|
2016-12-14 23:53:44 -08:00
|
|
|
if (!key) {
|
2016-12-15 21:24:11 -08:00
|
|
|
nullPointerEx.Throw(env, "key cannot be null");
|
2016-12-14 23:53:44 -08:00
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
if (!defaultValue) {
|
2016-12-15 21:24:11 -08:00
|
|
|
nullPointerEx.Throw(env, "defaultValue cannot be null");
|
2016-12-14 23:53:44 -08:00
|
|
|
return false;
|
|
|
|
|
}
|
2016-07-13 00:31:03 -07:00
|
|
|
auto v = FromJavaDoubleArray(env, defaultValue);
|
2016-09-25 19:29:17 -07:00
|
|
|
return nt::SetDefaultEntryValue(JStringRef{env, key}, v);
|
2016-07-13 00:31:03 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Class: edu_wpi_first_wpilibj_networktables_NetworkTablesJNI
|
|
|
|
|
* Method: setDefaultStringArray
|
|
|
|
|
* Signature: (Ljava/lang/String;[Ljava/lang/String;)Z
|
|
|
|
|
*/
|
|
|
|
|
JNIEXPORT jboolean JNICALL Java_edu_wpi_first_wpilibj_networktables_NetworkTablesJNI_setDefaultStringArray
|
|
|
|
|
(JNIEnv *env, jclass, jstring key, jobjectArray defaultValue)
|
|
|
|
|
{
|
2016-12-14 23:53:44 -08:00
|
|
|
if (!key) {
|
2016-12-15 21:24:11 -08:00
|
|
|
nullPointerEx.Throw(env, "key cannot be null");
|
2016-12-14 23:53:44 -08:00
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
if (!defaultValue) {
|
2016-12-15 21:24:11 -08:00
|
|
|
nullPointerEx.Throw(env, "defaultValue cannot be null");
|
2016-12-14 23:53:44 -08:00
|
|
|
return false;
|
|
|
|
|
}
|
2016-07-13 00:31:03 -07:00
|
|
|
auto v = FromJavaStringArray(env, defaultValue);
|
2016-09-25 19:29:17 -07:00
|
|
|
return nt::SetDefaultEntryValue(JStringRef{env, key}, v);
|
2016-07-13 00:31:03 -07:00
|
|
|
}
|
|
|
|
|
|
2015-08-28 12:35:04 -07:00
|
|
|
/*
|
|
|
|
|
* Class: edu_wpi_first_wpilibj_networktables_NetworkTablesJNI
|
|
|
|
|
* Method: setEntryFlags
|
|
|
|
|
* Signature: (Ljava/lang/String;I)V
|
|
|
|
|
*/
|
|
|
|
|
JNIEXPORT void JNICALL Java_edu_wpi_first_wpilibj_networktables_NetworkTablesJNI_setEntryFlags
|
|
|
|
|
(JNIEnv *env, jclass, jstring key, jint flags)
|
|
|
|
|
{
|
2016-12-14 23:53:44 -08:00
|
|
|
if (!key) {
|
2016-12-15 21:24:11 -08:00
|
|
|
nullPointerEx.Throw(env, "key cannot be null");
|
2016-12-14 23:53:44 -08:00
|
|
|
return;
|
|
|
|
|
}
|
2016-09-25 19:29:17 -07:00
|
|
|
nt::SetEntryFlags(JStringRef{env, key}, flags);
|
2015-08-28 12:35:04 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Class: edu_wpi_first_wpilibj_networktables_NetworkTablesJNI
|
|
|
|
|
* Method: getEntryFlags
|
|
|
|
|
* Signature: (Ljava/lang/String;)I
|
|
|
|
|
*/
|
|
|
|
|
JNIEXPORT jint JNICALL Java_edu_wpi_first_wpilibj_networktables_NetworkTablesJNI_getEntryFlags
|
|
|
|
|
(JNIEnv *env, jclass, jstring key)
|
|
|
|
|
{
|
2016-12-14 23:53:44 -08:00
|
|
|
if (!key) {
|
2016-12-15 21:24:11 -08:00
|
|
|
nullPointerEx.Throw(env, "key cannot be null");
|
2016-12-14 23:53:44 -08:00
|
|
|
return 0;
|
|
|
|
|
}
|
2016-09-25 19:29:17 -07:00
|
|
|
return nt::GetEntryFlags(JStringRef{env, key});
|
2015-08-28 12:35:04 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Class: edu_wpi_first_wpilibj_networktables_NetworkTablesJNI
|
|
|
|
|
* Method: deleteEntry
|
|
|
|
|
* Signature: (Ljava/lang/String;)V
|
|
|
|
|
*/
|
|
|
|
|
JNIEXPORT void JNICALL Java_edu_wpi_first_wpilibj_networktables_NetworkTablesJNI_deleteEntry
|
|
|
|
|
(JNIEnv *env, jclass, jstring key)
|
|
|
|
|
{
|
2016-12-14 23:53:44 -08:00
|
|
|
if (!key) {
|
2016-12-15 21:24:11 -08:00
|
|
|
nullPointerEx.Throw(env, "key cannot be null");
|
2016-12-14 23:53:44 -08:00
|
|
|
return;
|
|
|
|
|
}
|
2016-09-25 19:29:17 -07:00
|
|
|
nt::DeleteEntry(JStringRef{env, key});
|
2015-08-28 12:35:04 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Class: edu_wpi_first_wpilibj_networktables_NetworkTablesJNI
|
|
|
|
|
* Method: deleteAllEntries
|
|
|
|
|
* Signature: ()V
|
|
|
|
|
*/
|
|
|
|
|
JNIEXPORT void JNICALL Java_edu_wpi_first_wpilibj_networktables_NetworkTablesJNI_deleteAllEntries
|
|
|
|
|
(JNIEnv *, jclass)
|
|
|
|
|
{
|
|
|
|
|
nt::DeleteAllEntries();
|
|
|
|
|
}
|
|
|
|
|
|
2015-09-16 00:50:31 -07:00
|
|
|
/*
|
|
|
|
|
* Class: edu_wpi_first_wpilibj_networktables_NetworkTablesJNI
|
|
|
|
|
* Method: getEntries
|
|
|
|
|
* Signature: (Ljava/lang/String;I)[Ledu/wpi/first/wpilibj/networktables/EntryInfo;
|
|
|
|
|
*/
|
|
|
|
|
JNIEXPORT jobjectArray JNICALL Java_edu_wpi_first_wpilibj_networktables_NetworkTablesJNI_getEntries
|
|
|
|
|
(JNIEnv *env, jclass, jstring prefix, jint types)
|
|
|
|
|
{
|
2016-12-14 23:53:44 -08:00
|
|
|
if (!prefix) {
|
2016-12-15 21:24:11 -08:00
|
|
|
nullPointerEx.Throw(env, "prefix cannot be null");
|
2016-12-14 23:53:44 -08:00
|
|
|
return nullptr;
|
|
|
|
|
}
|
2016-09-25 19:29:17 -07:00
|
|
|
auto arr = nt::GetEntryInfo(JStringRef{env, prefix}, types);
|
2015-09-16 00:50:31 -07:00
|
|
|
jobjectArray jarr = env->NewObjectArray(arr.size(), entryInfoCls, nullptr);
|
|
|
|
|
if (!jarr) return nullptr;
|
|
|
|
|
for (size_t i = 0; i < arr.size(); ++i) {
|
2016-09-25 19:29:17 -07:00
|
|
|
JLocal<jobject> jelem{env, MakeJObject(env, arr[i])};
|
2015-09-16 00:50:31 -07:00
|
|
|
env->SetObjectArrayElement(jarr, i, jelem);
|
|
|
|
|
}
|
|
|
|
|
return jarr;
|
|
|
|
|
}
|
|
|
|
|
|
2015-08-28 12:35:04 -07:00
|
|
|
/*
|
|
|
|
|
* Class: edu_wpi_first_wpilibj_networktables_NetworkTablesJNI
|
|
|
|
|
* Method: flush
|
|
|
|
|
* Signature: ()V
|
|
|
|
|
*/
|
|
|
|
|
JNIEXPORT void JNICALL Java_edu_wpi_first_wpilibj_networktables_NetworkTablesJNI_flush
|
|
|
|
|
(JNIEnv *, jclass)
|
|
|
|
|
{
|
|
|
|
|
nt::Flush();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Class: edu_wpi_first_wpilibj_networktables_NetworkTablesJNI
|
|
|
|
|
* Method: addEntryListener
|
|
|
|
|
* Signature: (Ljava/lang/String;Ledu/wpi/first/wpilibj/networktables/NetworkTablesJNI/EntryListenerFunction;Z)I
|
|
|
|
|
*/
|
|
|
|
|
JNIEXPORT jint JNICALL Java_edu_wpi_first_wpilibj_networktables_NetworkTablesJNI_addEntryListener
|
2015-09-25 11:54:17 -07:00
|
|
|
(JNIEnv *envouter, jclass, jstring prefix, jobject listener, jint flags)
|
2015-08-28 12:35:04 -07:00
|
|
|
{
|
2016-12-14 23:53:44 -08:00
|
|
|
if (!prefix) {
|
2016-12-15 21:24:11 -08:00
|
|
|
nullPointerEx.Throw(envouter, "prefix cannot be null");
|
2016-12-14 23:53:44 -08:00
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
if (!listener) {
|
2016-12-15 21:24:11 -08:00
|
|
|
nullPointerEx.Throw(envouter, "listener cannot be null");
|
2016-12-14 23:53:44 -08:00
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
2015-08-28 12:35:04 -07:00
|
|
|
// the shared pointer to the weak global will keep it around until the
|
|
|
|
|
// entry listener is destroyed
|
|
|
|
|
auto listener_global =
|
2016-09-25 19:29:17 -07:00
|
|
|
std::make_shared<JGlobal<jobject>>(envouter, listener);
|
2015-08-28 12:35:04 -07:00
|
|
|
|
|
|
|
|
// cls is a temporary here; cannot be used within callback functor
|
|
|
|
|
jclass cls = envouter->GetObjectClass(listener);
|
|
|
|
|
if (!cls) return 0;
|
|
|
|
|
|
|
|
|
|
// method ids, on the other hand, are safe to retain
|
|
|
|
|
jmethodID mid = envouter->GetMethodID(
|
2015-09-25 11:54:17 -07:00
|
|
|
cls, "apply", "(ILjava/lang/String;Ljava/lang/Object;I)V");
|
2015-08-28 12:35:04 -07:00
|
|
|
if (!mid) return 0;
|
|
|
|
|
|
|
|
|
|
return nt::AddEntryListener(
|
2016-09-25 19:29:17 -07:00
|
|
|
JStringRef{envouter, prefix},
|
2015-08-28 12:35:04 -07:00
|
|
|
[=](unsigned int uid, nt::StringRef name,
|
2015-09-25 11:54:17 -07:00
|
|
|
std::shared_ptr<nt::Value> value, unsigned int flags_) {
|
2015-12-20 20:42:09 -08:00
|
|
|
JNIEnv *env = listenerEnv;
|
2015-09-05 11:05:02 -07:00
|
|
|
if (!env || !env->functions) return;
|
2015-08-28 12:35:04 -07:00
|
|
|
|
2015-12-20 20:42:09 -08:00
|
|
|
// get the handler
|
|
|
|
|
auto handler = listener_global->obj();
|
|
|
|
|
|
|
|
|
|
// convert the value into the appropriate Java type
|
2016-09-25 19:29:17 -07:00
|
|
|
JLocal<jobject> jobj{env, MakeJObject(env, *value)};
|
2015-12-20 20:42:09 -08:00
|
|
|
if (env->ExceptionCheck()) {
|
|
|
|
|
env->ExceptionDescribe();
|
|
|
|
|
env->ExceptionClear();
|
|
|
|
|
return;
|
|
|
|
|
}
|
2016-01-01 19:05:00 -08:00
|
|
|
if (!jobj) return;
|
|
|
|
|
|
2016-09-25 19:29:17 -07:00
|
|
|
JLocal<jstring> jname{env, MakeJString(env, name)};
|
2016-01-01 19:05:00 -08:00
|
|
|
env->CallVoidMethod(handler, mid, (jint)uid, jname.obj(), jobj.obj(),
|
|
|
|
|
(jint)(flags_));
|
2015-12-20 20:42:09 -08:00
|
|
|
if (env->ExceptionCheck()) {
|
|
|
|
|
env->ExceptionDescribe();
|
|
|
|
|
env->ExceptionClear();
|
2015-08-28 12:35:04 -07:00
|
|
|
}
|
|
|
|
|
},
|
2015-09-25 11:54:17 -07:00
|
|
|
flags);
|
2015-08-28 12:35:04 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Class: edu_wpi_first_wpilibj_networktables_NetworkTablesJNI
|
|
|
|
|
* Method: removeEntryListener
|
|
|
|
|
* Signature: (I)V
|
|
|
|
|
*/
|
|
|
|
|
JNIEXPORT void JNICALL Java_edu_wpi_first_wpilibj_networktables_NetworkTablesJNI_removeEntryListener
|
|
|
|
|
(JNIEnv *, jclass, jint entryListenerUid)
|
|
|
|
|
{
|
|
|
|
|
nt::RemoveEntryListener(entryListenerUid);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Class: edu_wpi_first_wpilibj_networktables_NetworkTablesJNI
|
|
|
|
|
* Method: addConnectionListener
|
|
|
|
|
* Signature: (Ledu/wpi/first/wpilibj/networktables/NetworkTablesJNI/ConnectionListenerFunction;Z)I
|
|
|
|
|
*/
|
|
|
|
|
JNIEXPORT jint JNICALL Java_edu_wpi_first_wpilibj_networktables_NetworkTablesJNI_addConnectionListener
|
|
|
|
|
(JNIEnv *envouter, jclass, jobject listener, jboolean immediateNotify)
|
|
|
|
|
{
|
2016-12-14 23:53:44 -08:00
|
|
|
if (!listener) {
|
2016-12-15 21:24:11 -08:00
|
|
|
nullPointerEx.Throw(envouter, "listener cannot be null");
|
2016-12-14 23:53:44 -08:00
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
2015-08-28 12:35:04 -07:00
|
|
|
// the shared pointer to the weak global will keep it around until the
|
|
|
|
|
// entry listener is destroyed
|
|
|
|
|
auto listener_global =
|
2016-09-25 19:29:17 -07:00
|
|
|
std::make_shared<JGlobal<jobject>>(envouter, listener);
|
2015-08-28 12:35:04 -07:00
|
|
|
|
|
|
|
|
// cls is a temporary here; cannot be used within callback functor
|
|
|
|
|
jclass cls = envouter->GetObjectClass(listener);
|
|
|
|
|
if (!cls) return 0;
|
|
|
|
|
|
|
|
|
|
// method ids, on the other hand, are safe to retain
|
|
|
|
|
jmethodID mid = envouter->GetMethodID(
|
|
|
|
|
cls, "apply", "(IZLedu/wpi/first/wpilibj/networktables/ConnectionInfo;)V");
|
|
|
|
|
if (!mid) return 0;
|
|
|
|
|
|
|
|
|
|
return nt::AddConnectionListener(
|
|
|
|
|
[=](unsigned int uid, bool connected, const nt::ConnectionInfo& conn) {
|
2015-12-20 20:42:09 -08:00
|
|
|
JNIEnv *env = listenerEnv;
|
2015-09-05 11:05:02 -07:00
|
|
|
if (!env || !env->functions) return;
|
2015-08-28 12:35:04 -07:00
|
|
|
|
2015-12-20 20:42:09 -08:00
|
|
|
// get the handler
|
|
|
|
|
auto handler = listener_global->obj();
|
|
|
|
|
//if (!handler) goto done; // can happen due to weak reference
|
|
|
|
|
|
|
|
|
|
// convert into the appropriate Java type
|
2016-09-25 19:29:17 -07:00
|
|
|
JLocal<jobject> jobj{env, MakeJObject(env, conn)};
|
2015-12-20 20:42:09 -08:00
|
|
|
if (env->ExceptionCheck()) {
|
|
|
|
|
env->ExceptionDescribe();
|
|
|
|
|
env->ExceptionClear();
|
|
|
|
|
return;
|
|
|
|
|
}
|
2016-01-01 19:05:00 -08:00
|
|
|
if (!jobj) return;
|
|
|
|
|
|
2015-12-20 20:42:09 -08:00
|
|
|
env->CallVoidMethod(handler, mid, (jint)uid,
|
2016-01-01 19:05:00 -08:00
|
|
|
(jboolean)(connected ? 1 : 0), jobj.obj());
|
2015-12-20 20:42:09 -08:00
|
|
|
if (env->ExceptionCheck()) {
|
|
|
|
|
env->ExceptionDescribe();
|
|
|
|
|
env->ExceptionClear();
|
2015-08-28 12:35:04 -07:00
|
|
|
}
|
|
|
|
|
},
|
2015-08-28 14:07:51 -07:00
|
|
|
immediateNotify != JNI_FALSE);
|
2015-08-28 12:35:04 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Class: edu_wpi_first_wpilibj_networktables_NetworkTablesJNI
|
|
|
|
|
* Method: removeConnectionListener
|
|
|
|
|
* Signature: (I)V
|
|
|
|
|
*/
|
|
|
|
|
JNIEXPORT void JNICALL Java_edu_wpi_first_wpilibj_networktables_NetworkTablesJNI_removeConnectionListener
|
|
|
|
|
(JNIEnv *, jclass, jint connListenerUid)
|
|
|
|
|
{
|
|
|
|
|
nt::RemoveConnectionListener(connListenerUid);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Class: edu_wpi_first_wpilibj_networktables_NetworkTablesJNI
|
|
|
|
|
* Method: getRpc
|
|
|
|
|
* Signature: (Ljava/lang/String;)[B
|
|
|
|
|
*/
|
|
|
|
|
JNIEXPORT jbyteArray JNICALL Java_edu_wpi_first_wpilibj_networktables_NetworkTablesJNI_getRpc__Ljava_lang_String_2
|
|
|
|
|
(JNIEnv *env, jclass, jstring key)
|
|
|
|
|
{
|
2016-12-14 23:53:44 -08:00
|
|
|
if (!key) {
|
2016-12-15 21:24:11 -08:00
|
|
|
nullPointerEx.Throw(env, "key cannot be null");
|
2016-12-14 23:53:44 -08:00
|
|
|
return nullptr;
|
|
|
|
|
}
|
2016-09-25 19:29:17 -07:00
|
|
|
auto val = nt::GetEntryValue(JStringRef{env, key});
|
2015-08-28 12:35:04 -07:00
|
|
|
if (!val || !val->IsRpc()) {
|
2016-12-15 21:24:11 -08:00
|
|
|
keyNotDefinedEx.Throw(env, key);
|
2015-08-28 12:35:04 -07:00
|
|
|
return nullptr;
|
|
|
|
|
}
|
2016-09-25 19:29:17 -07:00
|
|
|
return MakeJByteArray(env, val->GetRpc());
|
2015-08-28 12:35:04 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Class: edu_wpi_first_wpilibj_networktables_NetworkTablesJNI
|
|
|
|
|
* Method: getRpc
|
|
|
|
|
* Signature: (Ljava/lang/String;[B)[B
|
|
|
|
|
*/
|
|
|
|
|
JNIEXPORT jbyteArray JNICALL Java_edu_wpi_first_wpilibj_networktables_NetworkTablesJNI_getRpc__Ljava_lang_String_2_3B
|
|
|
|
|
(JNIEnv *env, jclass, jstring key, jbyteArray defaultValue)
|
|
|
|
|
{
|
2016-12-14 23:53:44 -08:00
|
|
|
if (!key) {
|
2016-12-15 21:24:11 -08:00
|
|
|
nullPointerEx.Throw(env, "key cannot be null");
|
2016-12-14 23:53:44 -08:00
|
|
|
return nullptr;
|
|
|
|
|
}
|
|
|
|
|
if (!defaultValue) {
|
2016-12-15 21:24:11 -08:00
|
|
|
nullPointerEx.Throw(env, "defaultValue cannot be null");
|
2016-12-14 23:53:44 -08:00
|
|
|
return nullptr;
|
|
|
|
|
}
|
2016-09-25 19:29:17 -07:00
|
|
|
auto val = nt::GetEntryValue(JStringRef{env, key});
|
2015-08-28 12:35:04 -07:00
|
|
|
if (!val || !val->IsRpc()) return defaultValue;
|
2016-09-25 19:29:17 -07:00
|
|
|
return MakeJByteArray(env, val->GetRpc());
|
2015-08-28 12:35:04 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Class: edu_wpi_first_wpilibj_networktables_NetworkTablesJNI
|
|
|
|
|
* Method: callRpc
|
|
|
|
|
* Signature: (Ljava/lang/String;[B)I
|
|
|
|
|
*/
|
2015-11-20 01:22:26 -08:00
|
|
|
JNIEXPORT jint JNICALL Java_edu_wpi_first_wpilibj_networktables_NetworkTablesJNI_callRpc__Ljava_lang_String_2_3B
|
2015-08-28 12:35:04 -07:00
|
|
|
(JNIEnv *env, jclass, jstring key, jbyteArray params)
|
|
|
|
|
{
|
2016-12-14 23:53:44 -08:00
|
|
|
if (!key) {
|
2016-12-15 21:24:11 -08:00
|
|
|
nullPointerEx.Throw(env, "key cannot be null");
|
2016-12-14 23:53:44 -08:00
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
if (!params) {
|
2016-12-15 21:24:11 -08:00
|
|
|
nullPointerEx.Throw(env, "params cannot be null");
|
2016-12-14 23:53:44 -08:00
|
|
|
return 0;
|
|
|
|
|
}
|
2016-09-25 19:29:17 -07:00
|
|
|
return nt::CallRpc(JStringRef{env, key}, JByteArrayRef{env, params});
|
2015-08-28 12:35:04 -07:00
|
|
|
}
|
|
|
|
|
|
2015-11-20 01:22:26 -08:00
|
|
|
/*
|
|
|
|
|
* Class: edu_wpi_first_wpilibj_networktables_NetworkTablesJNI
|
|
|
|
|
* Method: callRpc
|
|
|
|
|
* Signature: (Ljava/lang/String;Ljava/nio/ByteBuffer;I)I
|
|
|
|
|
*/
|
|
|
|
|
JNIEXPORT jint JNICALL Java_edu_wpi_first_wpilibj_networktables_NetworkTablesJNI_callRpc__Ljava_lang_String_2Ljava_nio_ByteBuffer_2I
|
|
|
|
|
(JNIEnv *env, jclass, jstring key, jobject params, jint params_len)
|
|
|
|
|
{
|
2016-12-14 23:53:44 -08:00
|
|
|
if (!key) {
|
2016-12-15 21:24:11 -08:00
|
|
|
nullPointerEx.Throw(env, "key cannot be null");
|
2016-12-14 23:53:44 -08:00
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
if (!params) {
|
2016-12-15 21:24:11 -08:00
|
|
|
nullPointerEx.Throw(env, "params cannot be null");
|
2016-12-14 23:53:44 -08:00
|
|
|
return 0;
|
|
|
|
|
}
|
2016-09-25 19:29:17 -07:00
|
|
|
return nt::CallRpc(JStringRef{env, key},
|
|
|
|
|
JByteArrayRef{env, params, params_len});
|
2015-11-20 01:22:26 -08:00
|
|
|
}
|
|
|
|
|
|
2015-08-28 12:35:04 -07:00
|
|
|
/*
|
|
|
|
|
* Class: edu_wpi_first_wpilibj_networktables_NetworkTablesJNI
|
|
|
|
|
* Method: setNetworkIdentity
|
|
|
|
|
* Signature: (Ljava/lang/String;)V
|
|
|
|
|
*/
|
|
|
|
|
JNIEXPORT void JNICALL Java_edu_wpi_first_wpilibj_networktables_NetworkTablesJNI_setNetworkIdentity
|
|
|
|
|
(JNIEnv *env, jclass, jstring name)
|
|
|
|
|
{
|
2016-12-14 23:53:44 -08:00
|
|
|
if (!name) {
|
2016-12-15 21:24:11 -08:00
|
|
|
nullPointerEx.Throw(env, "name cannot be null");
|
2016-12-14 23:53:44 -08:00
|
|
|
return;
|
|
|
|
|
}
|
2016-09-25 19:29:17 -07:00
|
|
|
nt::SetNetworkIdentity(JStringRef{env, name});
|
2015-08-28 12:35:04 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Class: edu_wpi_first_wpilibj_networktables_NetworkTablesJNI
|
|
|
|
|
* Method: startServer
|
|
|
|
|
* Signature: (Ljava/lang/String;Ljava/lang/String;I)V
|
|
|
|
|
*/
|
|
|
|
|
JNIEXPORT void JNICALL Java_edu_wpi_first_wpilibj_networktables_NetworkTablesJNI_startServer
|
|
|
|
|
(JNIEnv *env, jclass, jstring persistFilename, jstring listenAddress,
|
|
|
|
|
jint port)
|
|
|
|
|
{
|
2016-12-14 23:53:44 -08:00
|
|
|
if (!persistFilename) {
|
2016-12-15 21:24:11 -08:00
|
|
|
nullPointerEx.Throw(env, "persistFilename cannot be null");
|
2016-12-14 23:53:44 -08:00
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
if (!listenAddress) {
|
2016-12-15 21:24:11 -08:00
|
|
|
nullPointerEx.Throw(env, "listenAddress cannot be null");
|
2016-12-14 23:53:44 -08:00
|
|
|
return;
|
|
|
|
|
}
|
2016-09-25 19:29:17 -07:00
|
|
|
nt::StartServer(JStringRef{env, persistFilename},
|
|
|
|
|
JStringRef{env, listenAddress}.c_str(), port);
|
2015-08-28 12:35:04 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Class: edu_wpi_first_wpilibj_networktables_NetworkTablesJNI
|
|
|
|
|
* Method: stopServer
|
|
|
|
|
* Signature: ()V
|
|
|
|
|
*/
|
|
|
|
|
JNIEXPORT void JNICALL Java_edu_wpi_first_wpilibj_networktables_NetworkTablesJNI_stopServer
|
|
|
|
|
(JNIEnv *, jclass)
|
|
|
|
|
{
|
|
|
|
|
nt::StopServer();
|
|
|
|
|
}
|
|
|
|
|
|
2016-11-04 16:01:42 -07:00
|
|
|
/*
|
|
|
|
|
* Class: edu_wpi_first_wpilibj_networktables_NetworkTablesJNI
|
|
|
|
|
* Method: startClient
|
|
|
|
|
* Signature: ()V
|
|
|
|
|
*/
|
|
|
|
|
JNIEXPORT void JNICALL Java_edu_wpi_first_wpilibj_networktables_NetworkTablesJNI_startClient__
|
|
|
|
|
(JNIEnv *env, jclass)
|
|
|
|
|
{
|
|
|
|
|
nt::StartClient();
|
|
|
|
|
}
|
|
|
|
|
|
2015-08-28 12:35:04 -07:00
|
|
|
/*
|
|
|
|
|
* Class: edu_wpi_first_wpilibj_networktables_NetworkTablesJNI
|
|
|
|
|
* Method: startClient
|
|
|
|
|
* Signature: (Ljava/lang/String;I)V
|
|
|
|
|
*/
|
2016-04-08 13:31:35 -07:00
|
|
|
JNIEXPORT void JNICALL Java_edu_wpi_first_wpilibj_networktables_NetworkTablesJNI_startClient__Ljava_lang_String_2I
|
2015-08-28 12:35:04 -07:00
|
|
|
(JNIEnv *env, jclass, jstring serverName, jint port)
|
|
|
|
|
{
|
2016-12-14 23:53:44 -08:00
|
|
|
if (!serverName) {
|
2016-12-15 21:24:11 -08:00
|
|
|
nullPointerEx.Throw(env, "serverName cannot be null");
|
2016-12-14 23:53:44 -08:00
|
|
|
return;
|
|
|
|
|
}
|
2016-09-25 19:29:17 -07:00
|
|
|
nt::StartClient(JStringRef{env, serverName}.c_str(), port);
|
2015-08-28 12:35:04 -07:00
|
|
|
}
|
|
|
|
|
|
2016-04-08 13:31:35 -07:00
|
|
|
/*
|
|
|
|
|
* Class: edu_wpi_first_wpilibj_networktables_NetworkTablesJNI
|
|
|
|
|
* Method: startClient
|
|
|
|
|
* Signature: ([Ljava/lang/String;[I)V
|
|
|
|
|
*/
|
|
|
|
|
JNIEXPORT void JNICALL Java_edu_wpi_first_wpilibj_networktables_NetworkTablesJNI_startClient___3Ljava_lang_String_2_3I
|
|
|
|
|
(JNIEnv *env, jclass, jobjectArray serverNames, jintArray ports)
|
|
|
|
|
{
|
2016-12-14 23:53:44 -08:00
|
|
|
if (!serverNames) {
|
2016-12-15 21:24:11 -08:00
|
|
|
nullPointerEx.Throw(env, "serverNames cannot be null");
|
2016-12-14 23:53:44 -08:00
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
if (!ports) {
|
2016-12-15 21:24:11 -08:00
|
|
|
nullPointerEx.Throw(env, "ports cannot be null");
|
2016-12-14 23:53:44 -08:00
|
|
|
return;
|
|
|
|
|
}
|
2016-04-08 13:31:35 -07:00
|
|
|
int len = env->GetArrayLength(serverNames);
|
|
|
|
|
if (len != env->GetArrayLength(ports)) {
|
2016-12-15 21:24:11 -08:00
|
|
|
illegalArgEx.Throw(env,
|
|
|
|
|
"serverNames and ports arrays must be the same size");
|
2016-04-08 13:31:35 -07:00
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
jint* portInts = env->GetIntArrayElements(ports, nullptr);
|
|
|
|
|
if (!portInts) return;
|
|
|
|
|
|
|
|
|
|
std::vector<std::string> names;
|
|
|
|
|
std::vector<std::pair<nt::StringRef, unsigned int>> servers;
|
|
|
|
|
names.reserve(len);
|
|
|
|
|
servers.reserve(len);
|
|
|
|
|
for (int i = 0; i < len; ++i) {
|
2016-09-25 19:29:17 -07:00
|
|
|
JLocal<jstring> elem{
|
|
|
|
|
env, static_cast<jstring>(env->GetObjectArrayElement(serverNames, i))};
|
2016-04-08 13:31:35 -07:00
|
|
|
if (!elem) {
|
2016-12-15 21:24:11 -08:00
|
|
|
nullPointerEx.Throw(env, "null string in serverNames");
|
2016-04-08 13:31:35 -07:00
|
|
|
return;
|
|
|
|
|
}
|
2016-09-25 19:29:17 -07:00
|
|
|
names.emplace_back(JStringRef{env, elem}.str());
|
2016-04-08 13:31:35 -07:00
|
|
|
servers.emplace_back(std::make_pair(nt::StringRef(names.back()),
|
|
|
|
|
portInts[i]));
|
|
|
|
|
}
|
|
|
|
|
env->ReleaseIntArrayElements(ports, portInts, JNI_ABORT);
|
|
|
|
|
nt::StartClient(servers);
|
|
|
|
|
}
|
|
|
|
|
|
2015-08-28 12:35:04 -07:00
|
|
|
/*
|
|
|
|
|
* Class: edu_wpi_first_wpilibj_networktables_NetworkTablesJNI
|
|
|
|
|
* Method: stopClient
|
|
|
|
|
* Signature: ()V
|
|
|
|
|
*/
|
|
|
|
|
JNIEXPORT void JNICALL Java_edu_wpi_first_wpilibj_networktables_NetworkTablesJNI_stopClient
|
|
|
|
|
(JNIEnv *, jclass)
|
|
|
|
|
{
|
|
|
|
|
nt::StopClient();
|
|
|
|
|
}
|
|
|
|
|
|
2017-06-02 20:25:20 -04:00
|
|
|
/*
|
|
|
|
|
* Class: edu_wpi_first_wpilibj_networktables_NetworkTablesJNI
|
|
|
|
|
* Method: getNetworkMode
|
|
|
|
|
* Signature: ()
|
|
|
|
|
*/
|
|
|
|
|
JNIEXPORT jint JNICALL Java_edu_wpi_first_wpilibj_networktables_NetworkTablesJNI_getNetworkMode
|
|
|
|
|
(JNIEnv *, jclass)
|
|
|
|
|
{
|
|
|
|
|
return nt::GetNetworkMode();
|
|
|
|
|
}
|
|
|
|
|
|
2016-11-04 16:01:42 -07:00
|
|
|
/*
|
|
|
|
|
* Class: edu_wpi_first_wpilibj_networktables_NetworkTablesJNI
|
|
|
|
|
* Method: setServer
|
|
|
|
|
* Signature: (Ljava/lang/String;I)V
|
|
|
|
|
*/
|
|
|
|
|
JNIEXPORT void JNICALL Java_edu_wpi_first_wpilibj_networktables_NetworkTablesJNI_setServer__Ljava_lang_String_2I
|
|
|
|
|
(JNIEnv *env, jclass, jstring serverName, jint port)
|
|
|
|
|
{
|
2016-12-14 23:53:44 -08:00
|
|
|
if (!serverName) {
|
2016-12-15 21:24:11 -08:00
|
|
|
nullPointerEx.Throw(env, "serverName cannot be null");
|
2016-12-14 23:53:44 -08:00
|
|
|
return;
|
|
|
|
|
}
|
2016-11-04 16:01:42 -07:00
|
|
|
nt::SetServer(JStringRef{env, serverName}.c_str(), port);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Class: edu_wpi_first_wpilibj_networktables_NetworkTablesJNI
|
|
|
|
|
* Method: setServer
|
|
|
|
|
* Signature: ([Ljava/lang/String;[I)V
|
|
|
|
|
*/
|
|
|
|
|
JNIEXPORT void JNICALL Java_edu_wpi_first_wpilibj_networktables_NetworkTablesJNI_setServer___3Ljava_lang_String_2_3I
|
|
|
|
|
(JNIEnv *env, jclass, jobjectArray serverNames, jintArray ports)
|
|
|
|
|
{
|
2016-12-14 23:53:44 -08:00
|
|
|
if (!serverNames) {
|
2016-12-15 21:24:11 -08:00
|
|
|
nullPointerEx.Throw(env, "serverNames cannot be null");
|
2016-12-14 23:53:44 -08:00
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
if (!ports) {
|
2016-12-15 21:24:11 -08:00
|
|
|
nullPointerEx.Throw(env, "ports cannot be null");
|
2016-12-14 23:53:44 -08:00
|
|
|
return;
|
|
|
|
|
}
|
2016-11-04 16:01:42 -07:00
|
|
|
int len = env->GetArrayLength(serverNames);
|
|
|
|
|
if (len != env->GetArrayLength(ports)) {
|
2016-12-15 21:24:11 -08:00
|
|
|
illegalArgEx.Throw(env,
|
|
|
|
|
"serverNames and ports arrays must be the same size");
|
2016-11-04 16:01:42 -07:00
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
jint* portInts = env->GetIntArrayElements(ports, nullptr);
|
|
|
|
|
if (!portInts) return;
|
|
|
|
|
|
|
|
|
|
std::vector<std::string> names;
|
|
|
|
|
std::vector<std::pair<nt::StringRef, unsigned int>> servers;
|
|
|
|
|
names.reserve(len);
|
|
|
|
|
servers.reserve(len);
|
|
|
|
|
for (int i = 0; i < len; ++i) {
|
|
|
|
|
JLocal<jstring> elem{
|
|
|
|
|
env, static_cast<jstring>(env->GetObjectArrayElement(serverNames, i))};
|
|
|
|
|
if (!elem) {
|
2016-12-15 21:24:11 -08:00
|
|
|
nullPointerEx.Throw(env, "null string in serverNames");
|
2016-11-04 16:01:42 -07:00
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
names.emplace_back(JStringRef{env, elem}.str());
|
|
|
|
|
servers.emplace_back(std::make_pair(nt::StringRef(names.back()),
|
|
|
|
|
portInts[i]));
|
|
|
|
|
}
|
|
|
|
|
env->ReleaseIntArrayElements(ports, portInts, JNI_ABORT);
|
|
|
|
|
nt::SetServer(servers);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Class: edu_wpi_first_wpilibj_networktables_NetworkTablesJNI
|
|
|
|
|
* Method: startDSClient
|
|
|
|
|
* Signature: (I)V
|
|
|
|
|
*/
|
|
|
|
|
JNIEXPORT void JNICALL Java_edu_wpi_first_wpilibj_networktables_NetworkTablesJNI_startDSClient
|
|
|
|
|
(JNIEnv *env, jclass, jint port)
|
|
|
|
|
{
|
|
|
|
|
nt::StartDSClient(port);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Class: edu_wpi_first_wpilibj_networktables_NetworkTablesJNI
|
|
|
|
|
* Method: stopDSClient
|
|
|
|
|
* Signature: (I)V
|
|
|
|
|
*/
|
|
|
|
|
JNIEXPORT void JNICALL Java_edu_wpi_first_wpilibj_networktables_NetworkTablesJNI_stopDSClient
|
|
|
|
|
(JNIEnv *env, jclass)
|
|
|
|
|
{
|
|
|
|
|
nt::StopDSClient();
|
|
|
|
|
}
|
|
|
|
|
|
2015-08-28 12:35:04 -07:00
|
|
|
/*
|
|
|
|
|
* Class: edu_wpi_first_wpilibj_networktables_NetworkTablesJNI
|
|
|
|
|
* Method: setUpdateRate
|
|
|
|
|
* Signature: (D)V
|
|
|
|
|
*/
|
|
|
|
|
JNIEXPORT void JNICALL Java_edu_wpi_first_wpilibj_networktables_NetworkTablesJNI_setUpdateRate
|
|
|
|
|
(JNIEnv *, jclass, jdouble interval)
|
|
|
|
|
{
|
|
|
|
|
nt::SetUpdateRate(interval);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Class: edu_wpi_first_wpilibj_networktables_NetworkTablesJNI
|
|
|
|
|
* Method: getConnections
|
|
|
|
|
* Signature: ()[Ledu/wpi/first/wpilibj/networktables/ConnectionInfo;
|
|
|
|
|
*/
|
|
|
|
|
JNIEXPORT jobjectArray JNICALL Java_edu_wpi_first_wpilibj_networktables_NetworkTablesJNI_getConnections
|
|
|
|
|
(JNIEnv *env, jclass)
|
|
|
|
|
{
|
|
|
|
|
auto arr = nt::GetConnections();
|
|
|
|
|
jobjectArray jarr =
|
|
|
|
|
env->NewObjectArray(arr.size(), connectionInfoCls, nullptr);
|
|
|
|
|
if (!jarr) return nullptr;
|
|
|
|
|
for (size_t i = 0; i < arr.size(); ++i) {
|
2016-09-25 19:29:17 -07:00
|
|
|
JLocal<jobject> jelem{env, MakeJObject(env, arr[i])};
|
2015-08-28 12:35:04 -07:00
|
|
|
env->SetObjectArrayElement(jarr, i, jelem);
|
|
|
|
|
}
|
|
|
|
|
return jarr;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Class: edu_wpi_first_wpilibj_networktables_NetworkTablesJNI
|
|
|
|
|
* Method: savePersistent
|
|
|
|
|
* Signature: (Ljava/lang/String;)V
|
|
|
|
|
*/
|
|
|
|
|
JNIEXPORT void JNICALL Java_edu_wpi_first_wpilibj_networktables_NetworkTablesJNI_savePersistent
|
|
|
|
|
(JNIEnv *env, jclass, jstring filename)
|
|
|
|
|
{
|
2016-12-14 23:53:44 -08:00
|
|
|
if (!filename) {
|
2016-12-15 21:24:11 -08:00
|
|
|
nullPointerEx.Throw(env, "filename cannot be null");
|
2016-12-14 23:53:44 -08:00
|
|
|
return;
|
|
|
|
|
}
|
2016-09-25 19:29:17 -07:00
|
|
|
const char *err = nt::SavePersistent(JStringRef{env, filename});
|
2016-12-15 21:24:11 -08:00
|
|
|
if (err) persistentEx.Throw(env, err);
|
2015-08-28 12:35:04 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Class: edu_wpi_first_wpilibj_networktables_NetworkTablesJNI
|
|
|
|
|
* Method: loadPersistent
|
|
|
|
|
* Signature: (Ljava/lang/String;)[Ljava/lang/String;
|
|
|
|
|
*/
|
|
|
|
|
JNIEXPORT jobjectArray JNICALL Java_edu_wpi_first_wpilibj_networktables_NetworkTablesJNI_loadPersistent
|
|
|
|
|
(JNIEnv *env, jclass, jstring filename)
|
|
|
|
|
{
|
2016-12-14 23:53:44 -08:00
|
|
|
if (!filename) {
|
2016-12-15 21:24:11 -08:00
|
|
|
nullPointerEx.Throw(env, "filename cannot be null");
|
2016-12-14 23:53:44 -08:00
|
|
|
return nullptr;
|
|
|
|
|
}
|
2015-08-28 12:35:04 -07:00
|
|
|
std::vector<std::string> warns;
|
2016-09-25 19:29:17 -07:00
|
|
|
const char *err = nt::LoadPersistent(JStringRef{env, filename},
|
2015-08-28 12:35:04 -07:00
|
|
|
[&](size_t line, const char *msg) {
|
|
|
|
|
std::ostringstream oss;
|
|
|
|
|
oss << line << ": " << msg;
|
|
|
|
|
warns.push_back(oss.str());
|
|
|
|
|
});
|
|
|
|
|
if (err) {
|
2016-12-15 21:24:11 -08:00
|
|
|
persistentEx.Throw(env, err);
|
2015-08-28 12:35:04 -07:00
|
|
|
return nullptr;
|
|
|
|
|
}
|
2016-09-25 19:29:17 -07:00
|
|
|
return MakeJStringArray(env, warns);
|
2015-08-28 12:35:04 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Class: edu_wpi_first_wpilibj_networktables_NetworkTablesJNI
|
|
|
|
|
* Method: now
|
|
|
|
|
* Signature: ()J
|
|
|
|
|
*/
|
|
|
|
|
JNIEXPORT jlong JNICALL Java_edu_wpi_first_wpilibj_networktables_NetworkTablesJNI_now
|
|
|
|
|
(JNIEnv *, jclass)
|
|
|
|
|
{
|
|
|
|
|
return nt::Now();
|
|
|
|
|
}
|
|
|
|
|
|
2015-12-20 20:42:09 -08:00
|
|
|
} // extern "C"
|
|
|
|
|
|
2016-09-25 19:29:17 -07:00
|
|
|
namespace {
|
2015-12-20 20:42:09 -08:00
|
|
|
|
2016-09-25 19:29:17 -07:00
|
|
|
struct LogMessage {
|
2015-12-28 08:28:24 -08:00
|
|
|
public:
|
2016-09-25 19:29:17 -07:00
|
|
|
LogMessage(unsigned int level, const char *file, unsigned int line,
|
|
|
|
|
const char *msg)
|
|
|
|
|
: m_level(level), m_file(file), m_line(line), m_msg(msg) {}
|
|
|
|
|
|
|
|
|
|
void CallJava(JNIEnv* env, jobject func, jmethodID mid) {
|
|
|
|
|
JLocal<jstring> file{env, MakeJString(env, m_file)};
|
|
|
|
|
JLocal<jstring> msg{env, MakeJString(env, m_msg)};
|
|
|
|
|
env->CallVoidMethod(func, mid, (jint)m_level, file.obj(),
|
|
|
|
|
(jint)m_line, msg.obj());
|
2015-12-28 08:28:24 -08:00
|
|
|
}
|
2016-09-25 19:29:17 -07:00
|
|
|
|
|
|
|
|
static const char* GetName() { return "NTLogger"; }
|
|
|
|
|
static JavaVM* GetJVM() { return jvm; }
|
2015-12-20 21:06:17 -08:00
|
|
|
|
2015-12-28 08:28:24 -08:00
|
|
|
private:
|
2016-09-25 19:29:17 -07:00
|
|
|
unsigned int m_level;
|
|
|
|
|
const char* m_file;
|
|
|
|
|
unsigned int m_line;
|
|
|
|
|
std::string m_msg;
|
2015-12-28 08:28:24 -08:00
|
|
|
};
|
2015-12-20 20:55:36 -08:00
|
|
|
|
2016-09-25 19:29:17 -07:00
|
|
|
typedef JSingletonCallbackManager<LogMessage> LoggerJNI;
|
2015-12-20 20:42:09 -08:00
|
|
|
|
2016-09-25 19:29:17 -07:00
|
|
|
} // anonymous namespace
|
2015-12-20 20:42:09 -08:00
|
|
|
|
2016-09-25 19:29:17 -07:00
|
|
|
ATOMIC_STATIC_INIT(LoggerJNI)
|
2015-12-20 20:42:09 -08:00
|
|
|
|
|
|
|
|
extern "C" {
|
|
|
|
|
|
2015-08-28 12:35:04 -07:00
|
|
|
/*
|
|
|
|
|
* Class: edu_wpi_first_wpilibj_networktables_NetworkTablesJNI
|
|
|
|
|
* Method: setLogger
|
|
|
|
|
* Signature: (Ledu/wpi/first/wpilibj/networktables/NetworkTablesJNI/LoggerFunction;I)V
|
|
|
|
|
*/
|
|
|
|
|
JNIEXPORT void JNICALL Java_edu_wpi_first_wpilibj_networktables_NetworkTablesJNI_setLogger
|
2015-12-20 20:42:09 -08:00
|
|
|
(JNIEnv *env, jclass, jobject func, jint minLevel)
|
2015-08-28 12:35:04 -07:00
|
|
|
{
|
2016-12-14 23:53:44 -08:00
|
|
|
if (!func) {
|
2016-12-15 21:24:11 -08:00
|
|
|
nullPointerEx.Throw(env, "func cannot be null");
|
2016-12-14 23:53:44 -08:00
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
2015-08-28 12:35:04 -07:00
|
|
|
// cls is a temporary here; cannot be used within callback functor
|
2015-12-20 20:42:09 -08:00
|
|
|
jclass cls = env->GetObjectClass(func);
|
2015-08-28 12:35:04 -07:00
|
|
|
if (!cls) return;
|
|
|
|
|
|
|
|
|
|
// method ids, on the other hand, are safe to retain
|
2015-12-20 20:42:09 -08:00
|
|
|
jmethodID mid = env->GetMethodID(
|
2015-08-28 12:35:04 -07:00
|
|
|
cls, "apply", "(ILjava/lang/String;ILjava/lang/String;)V");
|
|
|
|
|
if (!mid) return;
|
|
|
|
|
|
2015-12-28 08:28:24 -08:00
|
|
|
auto& logger = LoggerJNI::GetInstance();
|
|
|
|
|
logger.Start();
|
|
|
|
|
logger.SetFunc(env, func, mid);
|
2015-08-28 12:35:04 -07:00
|
|
|
|
2015-12-20 20:42:09 -08:00
|
|
|
nt::SetLogger(
|
|
|
|
|
[](unsigned int level, const char *file, unsigned int line,
|
|
|
|
|
const char *msg) {
|
2016-09-25 19:29:17 -07:00
|
|
|
LoggerJNI::GetInstance().Send(level, file, line, msg);
|
2015-08-28 12:35:04 -07:00
|
|
|
},
|
|
|
|
|
minLevel);
|
|
|
|
|
}
|
2015-11-01 07:44:43 -08:00
|
|
|
|
|
|
|
|
} // extern "C"
|