diff options
author | Julien Decaen <[email protected]> | 2016-10-28 11:22:29 +0200 |
---|---|---|
committer | petreeftime <[email protected]> | 2016-10-28 13:35:36 +0200 |
commit | 2c3706fc16bf22c28ea3051703e98fc27b73f365 (patch) | |
tree | 3a0c749b33ae6a1485449c60812f5702665743da | |
parent | d9c777bc576b5365c2064d55fe872f272faa92e8 (diff) |
Fix JNI FindClass "tinyb/BluetoothNotification" not found
- Issue #52 : JNI call to findClass BluetoothNotification failed
- This issue happen with javafx application,
but not with "simple" java application.
- This issue happen only with "tinyb/BluetoothNotification" interface.
- Using the callback reference to retrieve the class instead of using
FindClass works fine.
Signed-off-by: Julien Decaen <[email protected]>
-rw-r--r-- | java/jni/BluetoothAdapter.cxx | 8 | ||||
-rw-r--r-- | java/jni/BluetoothDevice.cxx | 10 | ||||
-rw-r--r-- | java/jni/BluetoothGattCharacteristic.cxx | 2 | ||||
-rw-r--r-- | java/jni/BluetoothGattDescriptor.cxx | 2 | ||||
-rw-r--r-- | java/jni/helper.cxx | 11 | ||||
-rw-r--r-- | java/jni/helper.hpp | 1 |
6 files changed, 23 insertions, 11 deletions
diff --git a/java/jni/BluetoothAdapter.cxx b/java/jni/BluetoothAdapter.cxx index a28a4fac..28afd40b 100644 --- a/java/jni/BluetoothAdapter.cxx +++ b/java/jni/BluetoothAdapter.cxx @@ -286,7 +286,7 @@ void Java_tinyb_BluetoothAdapter_enablePoweredNotifications(JNIEnv *env, jobject std::shared_ptr<JNIGlobalRef> callback_ptr(new JNIGlobalRef(callback)); obj_adapter->enable_powered_notifications([ callback_ptr ] (bool v) { - jclass notification = search_class(*jni_env, JAVA_PACKAGE "/BluetoothNotification"); + jclass notification = search_class(*jni_env, **callback_ptr); jmethodID method = search_method(*jni_env, notification, "run", "(Ljava/lang/Object;)V", false); jclass boolean_cls = search_class(*jni_env, "java/lang/Boolean"); jmethodID constructor = search_method(*jni_env, boolean_cls, "<init>", "(Z)V", false); @@ -376,7 +376,7 @@ void Java_tinyb_BluetoothAdapter_enableDiscoverableNotifications(JNIEnv *env, jo std::shared_ptr<JNIGlobalRef> callback_ptr(new JNIGlobalRef(callback)); obj_adapter->enable_discoverable_notifications([ callback_ptr ] (bool v) { - jclass notification = search_class(*jni_env, JAVA_PACKAGE "/BluetoothNotification"); + jclass notification = search_class(*jni_env, **callback_ptr); jmethodID method = search_method(*jni_env, notification, "run", "(Ljava/lang/Object;)V", false); jclass boolean_cls = search_class(*jni_env, "java/lang/Boolean"); jmethodID constructor = search_method(*jni_env, boolean_cls, "<init>", "(Z)V", false); @@ -489,7 +489,7 @@ void Java_tinyb_BluetoothAdapter_enablePairableNotifications(JNIEnv *env, jobjec std::shared_ptr<JNIGlobalRef> callback_ptr(new JNIGlobalRef(callback)); obj_adapter->enable_pairable_notifications([ callback_ptr ] (bool v) { - jclass notification = search_class(*jni_env, JAVA_PACKAGE "/BluetoothNotification"); + jclass notification = search_class(*jni_env, **callback_ptr); jmethodID method = search_method(*jni_env, notification, "run", "(Ljava/lang/Object;)V", false); jclass boolean_cls = search_class(*jni_env, "java/lang/Boolean"); jmethodID constructor = search_method(*jni_env, boolean_cls, "<init>", "(Z)V", false); @@ -622,7 +622,7 @@ void Java_tinyb_BluetoothAdapter_enableDiscoveringNotifications(JNIEnv *env, job std::shared_ptr<JNIGlobalRef> callback_ptr(new JNIGlobalRef(callback)); obj_adapter->enable_discovering_notifications([ callback_ptr ] (bool v) { - jclass notification = search_class(*jni_env, JAVA_PACKAGE "/BluetoothNotification"); + jclass notification = search_class(*jni_env, **callback_ptr); jmethodID method = search_method(*jni_env, notification, "run", "(Ljava/lang/Object;)V", false); jclass boolean_cls = search_class(*jni_env, "java/lang/Boolean"); jmethodID constructor = search_method(*jni_env, boolean_cls, "<init>", "(Z)V", false); diff --git a/java/jni/BluetoothDevice.cxx b/java/jni/BluetoothDevice.cxx index 39a74162..895d7657 100644 --- a/java/jni/BluetoothDevice.cxx +++ b/java/jni/BluetoothDevice.cxx @@ -394,7 +394,7 @@ void Java_tinyb_BluetoothDevice_enablePairedNotifications(JNIEnv *env, jobject o std::shared_ptr<JNIGlobalRef> callback_ptr(new JNIGlobalRef(callback)); obj_device->enable_paired_notifications([ callback_ptr ] (bool v) { - jclass notification = search_class(*jni_env, JAVA_PACKAGE "/BluetoothNotification"); + jclass notification = search_class(*jni_env, **callback_ptr); jmethodID method = search_method(*jni_env, notification, "run", "(Ljava/lang/Object;)V", false); jclass boolean_cls = search_class(*jni_env, "java/lang/Boolean"); jmethodID constructor = search_method(*jni_env, boolean_cls, "<init>", "(Z)V", false); @@ -484,7 +484,7 @@ void Java_tinyb_BluetoothDevice_enableTrustedNotifications(JNIEnv *env, jobject std::shared_ptr<JNIGlobalRef> callback_ptr(new JNIGlobalRef(callback)); obj_device->enable_trusted_notifications([ callback_ptr ] (bool v) { - jclass notification = search_class(*jni_env, JAVA_PACKAGE "/BluetoothNotification"); + jclass notification = search_class(*jni_env, **callback_ptr); jmethodID method = search_method(*jni_env, notification, "run", "(Ljava/lang/Object;)V", false); jclass boolean_cls = search_class(*jni_env, "java/lang/Boolean"); jmethodID constructor = search_method(*jni_env, boolean_cls, "<init>", "(Z)V", false); @@ -574,7 +574,7 @@ void Java_tinyb_BluetoothDevice_enableBlockedNotifications(JNIEnv *env, jobject std::shared_ptr<JNIGlobalRef> callback_ptr(new JNIGlobalRef(callback)); obj_device->enable_blocked_notifications([ callback_ptr ] (bool v) { - jclass notification = search_class(*jni_env, JAVA_PACKAGE "/BluetoothNotification"); + jclass notification = search_class(*jni_env, **callback_ptr); jmethodID method = search_method(*jni_env, notification, "run", "(Ljava/lang/Object;)V", false); jclass boolean_cls = search_class(*jni_env, "java/lang/Boolean"); jmethodID constructor = search_method(*jni_env, boolean_cls, "<init>", "(Z)V", false); @@ -664,7 +664,7 @@ void Java_tinyb_BluetoothDevice_enableRSSINotifications(JNIEnv *env, jobject obj std::shared_ptr<JNIGlobalRef> callback_ptr(new JNIGlobalRef(callback)); obj_device->enable_rssi_notifications([ callback_ptr ] (int16_t v) { - jclass notification = search_class(*jni_env, JAVA_PACKAGE "/BluetoothNotification"); + jclass notification = search_class(*jni_env, **callback_ptr); jmethodID method = search_method(*jni_env, notification, "run", "(Ljava/lang/Object;)V", false); jclass short_cls = search_class(*jni_env, "java/lang/Short"); jmethodID constructor = search_method(*jni_env, short_cls, "<init>", "(S)V", false); @@ -734,7 +734,7 @@ void Java_tinyb_BluetoothDevice_enableConnectedNotifications(JNIEnv *env, jobjec std::shared_ptr<JNIGlobalRef> callback_ptr(new JNIGlobalRef(callback)); obj_device->enable_connected_notifications([ callback_ptr ] (bool v) { - jclass notification = search_class(*jni_env, JAVA_PACKAGE "/BluetoothNotification"); + jclass notification = search_class(*jni_env, **callback_ptr); jmethodID method = search_method(*jni_env, notification, "run", "(Ljava/lang/Object;)V", false); jclass boolean_cls = search_class(*jni_env, "java/lang/Boolean"); jmethodID constructor = search_method(*jni_env, boolean_cls, "<init>", "(Z)V", false); diff --git a/java/jni/BluetoothGattCharacteristic.cxx b/java/jni/BluetoothGattCharacteristic.cxx index da28194b..dcc4d26e 100644 --- a/java/jni/BluetoothGattCharacteristic.cxx +++ b/java/jni/BluetoothGattCharacteristic.cxx @@ -139,7 +139,7 @@ void Java_tinyb_BluetoothGattCharacteristic_enableValueNotifications(JNIEnv *env std::shared_ptr<JNIGlobalRef> callback_ptr(new JNIGlobalRef(callback)); obj_gatt_char->enable_value_notifications([ callback_ptr ] (std::vector<unsigned char> &v) { - jclass notification = search_class(*jni_env, JAVA_PACKAGE "/BluetoothNotification"); + jclass notification = search_class(*jni_env, **callback_ptr); jmethodID method = search_method(*jni_env, notification, "run", "(Ljava/lang/Object;)V", false); unsigned int size = v.size(); diff --git a/java/jni/BluetoothGattDescriptor.cxx b/java/jni/BluetoothGattDescriptor.cxx index ebe5b5d0..c7e441dd 100644 --- a/java/jni/BluetoothGattDescriptor.cxx +++ b/java/jni/BluetoothGattDescriptor.cxx @@ -212,7 +212,7 @@ void Java_tinyb_BluetoothGattDescriptor_enableValueNotifications(JNIEnv *env, jo std::shared_ptr<JNIGlobalRef> callback_ptr(new JNIGlobalRef(callback)); obj_gatt_desc->enable_value_notifications([ callback_ptr ] (std::vector<unsigned char> &v) { - jclass notification = search_class(*jni_env, JAVA_PACKAGE "/BluetoothNotification"); + jclass notification = search_class(*jni_env, **callback_ptr); jmethodID method = search_method(*jni_env, notification, "run", "(Ljava/lang/Object;)V", false); unsigned int size = v.size(); diff --git a/java/jni/helper.cxx b/java/jni/helper.cxx index 6952184f..3ff6ffb4 100644 --- a/java/jni/helper.cxx +++ b/java/jni/helper.cxx @@ -52,6 +52,17 @@ jclass search_class(JNIEnv *env, const char *clazz_name) return clazz; } +jclass search_class(JNIEnv *env, jobject obj) +{ + jclass clazz = env->GetObjectClass(obj); + if (!clazz) + { + std::string error = "no class found: "; + throw std::runtime_error(error); + } + return clazz; +} + jmethodID search_method(JNIEnv *env, jclass clazz, const char *method_name, const char *prototype, bool is_static) { diff --git a/java/jni/helper.hpp b/java/jni/helper.hpp index d5795973..4a4fb795 100644 --- a/java/jni/helper.hpp +++ b/java/jni/helper.hpp @@ -32,6 +32,7 @@ jfieldID getInstanceField(JNIEnv *env, jobject obj); jclass search_class(JNIEnv *env, const char *clazz_name); jclass search_class(JNIEnv *env, tinyb::BluetoothObject &object); +jclass search_class(JNIEnv *env, jobject obj); jmethodID search_method(JNIEnv *env, jclass clazz, const char *method_name, const char *prototype, bool is_static); jfieldID search_field(JNIEnv *env, jclass clazz, const char *field_name, |