Index: jni/Utils.cpp |
diff --git a/jni/Utils.cpp b/jni/Utils.cpp |
index b4c7cb60e982458591b1c75958a25b3f9c13912c..84e2b531c4d9708f04c293db439479e27520b994 100644 |
--- a/jni/Utils.cpp |
+++ b/jni/Utils.cpp |
@@ -15,6 +15,8 @@ |
* along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>. |
*/ |
+#include <string> |
+ |
#include "Utils.h" |
#include "Debug.h" |
@@ -36,3 +38,69 @@ const std::string GetString(JNIEnv *pEnv, jstring str) |
return value; |
} |
+ |
+std::string JniJavaToStdString(JNIEnv* env, jstring str) |
+{ |
+ if (!str) |
+ { |
+ return std::string(); |
+ } |
+ |
+ const char* cStr = env->GetStringUTFChars(str, 0); |
+ std::string ret(cStr); |
+ env->ReleaseStringUTFChars(str, cStr); |
+ |
+ return ret; |
+} |
+ |
+jobject NewJniArrayList(JNIEnv* env) |
+{ |
+ jclass clazz = env->FindClass("java/util/ArrayList"); |
+ jmethodID ctor = env->GetMethodID(clazz, "<init>", "()V"); |
+ return env->NewObject(clazz, ctor); |
+} |
+ |
+void JniAddObjectToList(JNIEnv* env, jobject list, jobject value) |
+{ |
+ jmethodID add = env->GetMethodID(env->GetObjectClass(list), "add", "(Ljava/lang/Object;)Z"); |
+ env->CallBooleanMethod(list, add, value); |
+} |
+ |
+void JniThrowException(JNIEnv* env, const std::string& message) |
+{ |
+ jclass clazz = env->FindClass(PKG("AdblockPlusException")); |
+ env->ThrowNew(clazz, message.c_str()); |
+} |
+ |
+void JniThrowException(JNIEnv* env, const std::exception& e) |
+{ |
+ JniThrowException(env, e.what()); |
+} |
+ |
+void JniThrowException(JNIEnv* env) |
+{ |
+ JniThrowException(env, "Unknown exception from libadblockplus"); |
+} |
+ |
+JNIEnvAcquire::JNIEnvAcquire(JavaVM* javaVM) |
+ : javaVM(javaVM), jniEnv(0), attachmentStatus(0) |
+{ |
+ attachmentStatus = javaVM->GetEnv((void **)&jniEnv, ABP_JNI_VERSION); |
+ if (attachmentStatus == JNI_EDETACHED) |
+ { |
+ if (javaVM->AttachCurrentThread(&jniEnv, 0)) |
+ { |
+ // This one is FATAL, we can't recover from this (because without a JVM we're dead), so |
+ // throwing a runtime_exception in a ctor can be tolerated here IMHO |
+ throw std::runtime_error("Failed to get JNI environment"); |
+ } |
+ } |
+} |
+ |
+JNIEnvAcquire::~JNIEnvAcquire() |
+{ |
+ if (attachmentStatus == JNI_EDETACHED) |
+ { |
+ javaVM->DetachCurrentThread(); |
+ } |
+} |