diff --git a/src/main/cpp/smsbuffer.cpp b/src/main/cpp/smsbuffer.cpp index c41e514..62d7ecf 100644 --- a/src/main/cpp/smsbuffer.cpp +++ b/src/main/cpp/smsbuffer.cpp @@ -28,29 +28,38 @@ const char *SmsBuffer::classPathName = "fr/unix_experience/owncloud_sms/jni/SmsB JNINativeMethod SmsBuffer::methods[] = { DECL_JNIMETHOD(createNativeObject, "()J") - DECL_JNIMETHOD(deleteNativeObject, "(J)V") - DECL_JNIMETHOD(empty, "(J)Z") - DECL_JNIMETHOD(asRawJsonString, "(J)Ljava/lang/String;") + DECL_JNIMETHOD(deleteNativeObject, "()V") + DECL_JNIMETHOD(empty, "()Z") + DECL_JNIMETHOD(asRawJsonString, "()Ljava/lang/String;") DECL_JNIMETHOD(push, - "(JIIIJLjava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V") - DECL_JNIMETHOD(print, "(J)V") + "(IIIJLjava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V") + DECL_JNIMETHOD(print, "()V") }; DECL_METHODSIZE(SmsBuffer) #define SMSBUFFER_CAST \ + if (!SmsBuffer::gJava_inited) { \ + SmsBuffer::gJava_inited = true; \ + SmsBuffer::gJava_mHandle = env->GetFieldID(env->GetObjectClass(self), "mHandle", "J"); \ + } \ + long ptr = env->GetLongField(self, SmsBuffer::gJava_mHandle); \ SmsBuffer *me = reinterpret_cast(ptr); \ if (!me) { \ __android_log_print(ANDROID_LOG_FATAL, LOG_TAG, "It's not a SmsBuffer!"); \ assert(false); \ } +bool SmsBuffer::gJava_inited = false; +jfieldID SmsBuffer::gJava_mHandle{}; + jlong SmsBuffer::createNativeObject(JNIEnv *env, jobject self) { return reinterpret_cast(new SmsBuffer()); } -void SmsBuffer::deleteNativeObject(JNIEnv *env, jobject self, jlong ptr) +void SmsBuffer::deleteNativeObject(JNIEnv *env, jobject self) { + SMSBUFFER_CAST __android_log_print(ANDROID_LOG_INFO, LOG_TAG, "deleteNativeObject 0x%li", ptr); delete reinterpret_cast(ptr); } @@ -62,7 +71,7 @@ void SmsBuffer::reset_buffer() m_sms_count = 0; } -void SmsBuffer::push(JNIEnv *env, jobject self, jlong ptr, jint msg_id, jint mailbox_id, jint type, +void SmsBuffer::push(JNIEnv *env, jobject self, jint msg_id, jint mailbox_id, jint type, jlong date, jstring address, jstring body, jstring read, jstring seen) { SMSBUFFER_CAST @@ -97,7 +106,7 @@ void SmsBuffer::_push(int msg_id, int mailbox_id, int type, m_sms_count++; } -jboolean SmsBuffer::empty(JNIEnv *env, jobject self, jlong ptr) +jboolean SmsBuffer::empty(JNIEnv *env, jobject self) { SMSBUFFER_CAST return (jboolean) (me->_empty() ? 1 : 0); @@ -108,7 +117,7 @@ bool SmsBuffer::_empty() const return m_buffer_empty; } -void SmsBuffer::print(JNIEnv *env, jobject self, jlong ptr) +void SmsBuffer::print(JNIEnv *env, jobject self) { SMSBUFFER_CAST me->_print(); @@ -120,7 +129,7 @@ void SmsBuffer::_print() m_buffer.str().c_str()); } -jstring SmsBuffer::asRawJsonString(JNIEnv *env, jobject self, jlong ptr) +jstring SmsBuffer::asRawJsonString(JNIEnv *env, jobject self) { SMSBUFFER_CAST std::string result; diff --git a/src/main/cpp/smsbuffer.h b/src/main/cpp/smsbuffer.h index 8e36082..2b7fa37 100644 --- a/src/main/cpp/smsbuffer.h +++ b/src/main/cpp/smsbuffer.h @@ -28,12 +28,12 @@ public: ~SmsBuffer() = default; JNIEXPORT static jlong JNICALL createNativeObject(JNIEnv *env, jobject self); - JNIEXPORT static void JNICALL deleteNativeObject(JNIEnv *env, jobject self, jlong ptr); + JNIEXPORT static void JNICALL deleteNativeObject(JNIEnv *env, jobject self); /* * push method */ - JNIEXPORT static void JNICALL push(JNIEnv *env, jobject self, jlong ptr, jint msg_id, + JNIEXPORT static void JNICALL push(JNIEnv *env, jobject self, jint msg_id, jint mailbox_id, jint type, jlong date, jstring address, jstring body, jstring read, jstring seen); void _push(int msg_id, int mailbox_id, int type, @@ -44,19 +44,19 @@ public: * empty method */ - JNIEXPORT static jboolean JNICALL empty(JNIEnv *env, jobject self, jlong ptr); + JNIEXPORT static jboolean JNICALL empty(JNIEnv *env, jobject self); bool _empty() const; /* * print method */ - JNIEXPORT static void JNICALL print(JNIEnv *env, jobject self, jlong ptr); + JNIEXPORT static void JNICALL print(JNIEnv *env, jobject self); void _print(); /* * asRawJsonString method */ - JNIEXPORT static jstring JNICALL asRawJsonString(JNIEnv *env, jobject self, jlong ptr); + JNIEXPORT static jstring JNICALL asRawJsonString(JNIEnv *env, jobject self); void as_raw_json_string(std::string &result); DECL_JNICLASSATTRS @@ -66,4 +66,7 @@ private: std::stringstream m_buffer; uint32_t m_sms_count{0}; bool m_buffer_empty{true}; + + static bool gJava_inited; + static jfieldID gJava_mHandle; }; \ No newline at end of file diff --git a/src/main/java/fr/unix_experience/owncloud_sms/jni/SmsBuffer.java b/src/main/java/fr/unix_experience/owncloud_sms/jni/SmsBuffer.java index a4ca381..7d2c6d8 100644 --- a/src/main/java/fr/unix_experience/owncloud_sms/jni/SmsBuffer.java +++ b/src/main/java/fr/unix_experience/owncloud_sms/jni/SmsBuffer.java @@ -36,53 +36,21 @@ public class SmsBuffer { } private static native long createNativeObject(); - private static native void deleteNativeObject(long handle); - - /* - JNI: push method - */ - public static native void push(long handle, int id, int mbid, int type, long date, - String address, String body, String read, String seen); - - public void push(int id, int mbid, int type, long date, String address, String body, - String read, String seen) { - if (mHandle == 0) { - throw new IllegalAccessError("Pushing data to empty native handler, aborting"); - } - SmsBuffer.push(mHandle, id, mbid, type, date, address, body, read, seen); - } + private native void deleteNativeObject(); + public native void push(int id, int mbid, int type, long date, String address, + String body, String read, String seen); + public native boolean empty(); + public native void print(); + public native String asRawJsonString(); public void clear() { if (mHandle == 0) { return; } - SmsBuffer.deleteNativeObject(mHandle); + deleteNativeObject(); mHandle = 0; } - /* - JNI: Eepty method - */ - public static native boolean empty(long handle); - public boolean empty() { - return SmsBuffer.empty(mHandle); - } - - /* - JNI: print method - */ - public static native void print(long handle); - public void print() { - SmsBuffer.print(mHandle); - } - - /* - JNI: asRawJsonString method - */ - public static native String asRawJsonString(long handle); - public String asRawJsonString() { - return SmsBuffer.asRawJsonString(mHandle); - } }