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[] =
{
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<SmsBuffer *>(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<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);
delete reinterpret_cast<SmsBuffer *>(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;

View File

@ -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;
};

View File

@ -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);
}
}