summaryrefslogtreecommitdiffstats
path: root/java
diff options
context:
space:
mode:
Diffstat (limited to 'java')
-rw-r--r--java/jni/direct_bt/CMakeLists.txt1
-rw-r--r--java/jni/direct_bt/DBTUtils.cxx57
-rw-r--r--java/org/tinyb/BluetoothUtils.java11
3 files changed, 69 insertions, 0 deletions
diff --git a/java/jni/direct_bt/CMakeLists.txt b/java/jni/direct_bt/CMakeLists.txt
index 9fd40026..60eacd6c 100644
--- a/java/jni/direct_bt/CMakeLists.txt
+++ b/java/jni/direct_bt/CMakeLists.txt
@@ -33,6 +33,7 @@ set (direct_bt_JNI_SRCS
${PROJECT_SOURCE_DIR}/java/jni/direct_bt/DBTGattService.cxx
${PROJECT_SOURCE_DIR}/java/jni/direct_bt/DBTManager.cxx
${PROJECT_SOURCE_DIR}/java/jni/direct_bt/DBTObject.cxx
+ ${PROJECT_SOURCE_DIR}/java/jni/direct_bt/DBTUtils.cxx
)
set (CMAKE_SHARED_LINKER_FLAGS "-Wl,--as-needed")
diff --git a/java/jni/direct_bt/DBTUtils.cxx b/java/jni/direct_bt/DBTUtils.cxx
new file mode 100644
index 00000000..5b53dbc6
--- /dev/null
+++ b/java/jni/direct_bt/DBTUtils.cxx
@@ -0,0 +1,57 @@
+/*
+ * Author: Sven Gothel <[email protected]>
+ * Copyright (c) 2020 Gothel Software e.K.
+ * Copyright (c) 2020 ZAFENA AB
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining
+ * a copy of this software and associated documentation files (the
+ * "Software"), to deal in the Software without restriction, including
+ * without limitation the rights to use, copy, modify, merge, publish,
+ * distribute, sublicense, and/or sell copies of the Software, and to
+ * permit persons to whom the Software is furnished to do so, subject to
+ * the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be
+ * included in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+ * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+ * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+ * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+#include "org_tinyb_BluetoothUtils.h"
+
+#include <cstdint>
+#include <cinttypes>
+
+#include <time.h>
+
+#include "helper_base.hpp"
+#include "helper_dbt.hpp"
+
+jstring Java_org_tinyb_BluetoothUtils_getUTF8String(JNIEnv *env, jclass clazz, jbyteArray jbuffer, jint offset, jint size) {
+ (void)clazz;
+
+ const int buffer_size = env->GetArrayLength(jbuffer);
+ if( 0 == buffer_size ) {
+ return env->NewStringUTF("");
+ }
+ if( buffer_size < offset+size ) {
+ throw direct_bt::IllegalArgumentException("buffer.length "+std::to_string(buffer_size)+
+ " < offset "+std::to_string(offset)+
+ " + size "+std::to_string(size), E_FILE_LINE);
+ }
+
+ JNICriticalArray<uint8_t> criticalArray(env); // RAII - release
+ uint8_t * buffer_ptr = criticalArray.get(jbuffer, criticalArray.Mode::NO_UPDATE_AND_RELEASE);
+ if( NULL == buffer_ptr ) {
+ throw direct_bt::InternalError("GetPrimitiveArrayCritical(byte array) is null", E_FILE_LINE);
+ }
+ std::string sres = direct_bt::getUTF8String(buffer_ptr+offset, size);
+
+ return from_string_to_jstring(env, sres);
+}
diff --git a/java/org/tinyb/BluetoothUtils.java b/java/org/tinyb/BluetoothUtils.java
index c50f85ef..e187ea3a 100644
--- a/java/org/tinyb/BluetoothUtils.java
+++ b/java/org/tinyb/BluetoothUtils.java
@@ -71,4 +71,15 @@ public class BluetoothUtils {
}
private static final char[] HEX_ARRAY = "0123456789ABCDEF".toCharArray();
+
+ /**
+ * Returns all valid consecutive UTF-8 characters within buffer
+ * in the range offset -> size or until EOS.
+ * <p>
+ * In case a non UTF-8 character has been detected,
+ * the content will be cut off and the decoding loop ends.
+ * </p>
+ */
+ public static native String getUTF8String(final byte[] buffer, final int offset, final int size);
+
}