1
0
mirror of https://github.com/nerzhul/ownCloud-SMS-App.git synced 2025-06-21 14:56:27 +00:00

Fix JNI implementation, don't use static methods in Java

This commit is contained in:
Loic Blot 2017-08-24 08:26:58 +02:00 committed by Loïc Blot
parent 38e529e3f6
commit d092ba4a4d
3 changed files with 34 additions and 54 deletions

View File

@ -28,29 +28,38 @@ const char *SmsBuffer::classPathName = "fr/unix_experience/owncloud_sms/jni/SmsB
JNINativeMethod SmsBuffer::methods[] = JNINativeMethod SmsBuffer::methods[] =
{ {
DECL_JNIMETHOD(createNativeObject, "()J") DECL_JNIMETHOD(createNativeObject, "()J")
DECL_JNIMETHOD(deleteNativeObject, "(J)V") DECL_JNIMETHOD(deleteNativeObject, "()V")
DECL_JNIMETHOD(empty, "(J)Z") DECL_JNIMETHOD(empty, "()Z")
DECL_JNIMETHOD(asRawJsonString, "(J)Ljava/lang/String;") DECL_JNIMETHOD(asRawJsonString, "()Ljava/lang/String;")
DECL_JNIMETHOD(push, DECL_JNIMETHOD(push,
"(JIIIJLjava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V") "(IIIJLjava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V")
DECL_JNIMETHOD(print, "(J)V") DECL_JNIMETHOD(print, "()V")
}; };
DECL_METHODSIZE(SmsBuffer) DECL_METHODSIZE(SmsBuffer)
#define SMSBUFFER_CAST \ #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<SmsBuffer *>(ptr); \ SmsBuffer *me = reinterpret_cast<SmsBuffer *>(ptr); \
if (!me) { \ if (!me) { \
__android_log_print(ANDROID_LOG_FATAL, LOG_TAG, "It's not a SmsBuffer!"); \ __android_log_print(ANDROID_LOG_FATAL, LOG_TAG, "It's not a SmsBuffer!"); \
assert(false); \ assert(false); \
} }
bool SmsBuffer::gJava_inited = false;
jfieldID SmsBuffer::gJava_mHandle{};
jlong SmsBuffer::createNativeObject(JNIEnv *env, jobject self) jlong SmsBuffer::createNativeObject(JNIEnv *env, jobject self)
{ {
return reinterpret_cast<jlong>(new SmsBuffer()); return reinterpret_cast<jlong>(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); __android_log_print(ANDROID_LOG_INFO, LOG_TAG, "deleteNativeObject 0x%li", ptr);
delete reinterpret_cast<SmsBuffer *>(ptr); delete reinterpret_cast<SmsBuffer *>(ptr);
} }
@ -62,7 +71,7 @@ void SmsBuffer::reset_buffer()
m_sms_count = 0; 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) jlong date, jstring address, jstring body, jstring read, jstring seen)
{ {
SMSBUFFER_CAST SMSBUFFER_CAST
@ -97,7 +106,7 @@ void SmsBuffer::_push(int msg_id, int mailbox_id, int type,
m_sms_count++; m_sms_count++;
} }
jboolean SmsBuffer::empty(JNIEnv *env, jobject self, jlong ptr) jboolean SmsBuffer::empty(JNIEnv *env, jobject self)
{ {
SMSBUFFER_CAST SMSBUFFER_CAST
return (jboolean) (me->_empty() ? 1 : 0); return (jboolean) (me->_empty() ? 1 : 0);
@ -108,7 +117,7 @@ bool SmsBuffer::_empty() const
return m_buffer_empty; return m_buffer_empty;
} }
void SmsBuffer::print(JNIEnv *env, jobject self, jlong ptr) void SmsBuffer::print(JNIEnv *env, jobject self)
{ {
SMSBUFFER_CAST SMSBUFFER_CAST
me->_print(); me->_print();
@ -120,7 +129,7 @@ void SmsBuffer::_print()
m_buffer.str().c_str()); m_buffer.str().c_str());
} }
jstring SmsBuffer::asRawJsonString(JNIEnv *env, jobject self, jlong ptr) jstring SmsBuffer::asRawJsonString(JNIEnv *env, jobject self)
{ {
SMSBUFFER_CAST SMSBUFFER_CAST
std::string result; std::string result;

View File

@ -28,12 +28,12 @@ public:
~SmsBuffer() = default; ~SmsBuffer() = default;
JNIEXPORT static jlong JNICALL createNativeObject(JNIEnv *env, jobject self); 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 * 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, jint mailbox_id, jint type, jlong date, jstring address,
jstring body, jstring read, jstring seen); jstring body, jstring read, jstring seen);
void _push(int msg_id, int mailbox_id, int type, void _push(int msg_id, int mailbox_id, int type,
@ -44,19 +44,19 @@ public:
* empty method * 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; bool _empty() const;
/* /*
* print method * print method
*/ */
JNIEXPORT static void JNICALL print(JNIEnv *env, jobject self, jlong ptr); JNIEXPORT static void JNICALL print(JNIEnv *env, jobject self);
void _print(); void _print();
/* /*
* asRawJsonString method * 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); void as_raw_json_string(std::string &result);
DECL_JNICLASSATTRS DECL_JNICLASSATTRS
@ -66,4 +66,7 @@ private:
std::stringstream m_buffer; std::stringstream m_buffer;
uint32_t m_sms_count{0}; uint32_t m_sms_count{0};
bool m_buffer_empty{true}; bool m_buffer_empty{true};
static bool gJava_inited;
static jfieldID gJava_mHandle;
}; };

View File

@ -36,53 +36,21 @@ public class SmsBuffer {
} }
private static native long createNativeObject(); private static native long createNativeObject();
private static native void deleteNativeObject(long handle); private native void deleteNativeObject();
public native void push(int id, int mbid, int type, long date, String address,
/* String body, String read, String seen);
JNI: push method public native boolean empty();
*/ public native void print();
public static native void push(long handle, int id, int mbid, int type, long date, public native String asRawJsonString();
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);
}
public void clear() { public void clear() {
if (mHandle == 0) { if (mHandle == 0) {
return; return;
} }
SmsBuffer.deleteNativeObject(mHandle); deleteNativeObject();
mHandle = 0; 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);
}
} }