1a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org/* 2a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org * Copyright (c) 2013 The WebRTC project authors. All Rights Reserved. 3a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org * 4a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org * Use of this source code is governed by a BSD-style license 5a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org * that can be found in the LICENSE file in the root of the source 6a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org * tree. An additional intellectual property rights grant can be found 7a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org * in the file PATENTS. All contributing project authors may 8a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org * be found in the AUTHORS file in the root of the source tree. 9a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org */ 10a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org 11a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org#ifndef WEBRTC_EXAMPLES_ANDROID_MEDIA_DEMO_JNI_JNI_HELPERS_H_ 12a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org#define WEBRTC_EXAMPLES_ANDROID_MEDIA_DEMO_JNI_JNI_HELPERS_H_ 13a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org 14a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org// TODO(henrike): this file contains duplication with regards to 15a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org// talk/app/webrtc/java/jni/peerconnection_jni.cc. When/if code can be shared 16a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org// between trunk/talk and trunk/webrtc remove the duplication. 17a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org 18a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org#include <android/log.h> 19a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org#include <jni.h> 20a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org 21a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org#include <map> 22a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org#include <string> 23a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org 24a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org#define TAG "WEBRTC-NATIVE" 25a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org 26a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org// Abort the process if |x| is false, emitting |msg| to logcat. 27a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org#define CHECK(x, msg) \ 28a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org if (x) { \ 29a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org } else { \ 30a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org __android_log_print(ANDROID_LOG_ERROR, TAG, "%s:%d: %s", __FILE__, \ 31a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org __LINE__, msg); \ 32a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org abort(); \ 33a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org } 34a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org 35a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org// Abort the process if |jni| has a Java exception pending, emitting |msg| to 36a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org// logcat. 37a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org#define CHECK_EXCEPTION(jni, msg) \ 38a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org if (0) { \ 39a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org } else { \ 40a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org if (jni->ExceptionCheck()) { \ 41a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org jni->ExceptionDescribe(); \ 42a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org jni->ExceptionClear(); \ 43a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org CHECK(0, msg); \ 44a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org } \ 45a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org } 46a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org 47a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org#define ARRAYSIZE(instance) \ 48a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org static_cast<int>(sizeof(instance) / sizeof(instance[0])) 49a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org 50a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org// JNIEnv-helper methods that CHECK success: no Java exception thrown and found 51a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org// object/class/method/field is non-null. 52a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.orgjmethodID GetMethodID(JNIEnv* jni, jclass c, const std::string& name, 53a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org const char* signature); 54a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org 55a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org// Return a |jlong| that will automatically convert back to |ptr| when assigned 56a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org// to a |uint64| 57a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.orgjlong jlongFromPointer(void* ptr); 58a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org 59a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org// Given a (UTF-16) jstring return a new UTF-8 native string. 60a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.orgstd::string JavaToStdString(JNIEnv* jni, const jstring& j_string); 61a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org 62a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org// Android's FindClass() is trickier than usual because the app-specific 63a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org// ClassLoader is not consulted when there is no app-specific frame on the 64a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org// stack. Consequently, we only look up classes once in JNI_OnLoad. 65a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org// http://developer.android.com/training/articles/perf-jni.html#faq_FindClass 66a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.orgclass ClassReferenceHolder { 67a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org public: 68a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org ClassReferenceHolder(JNIEnv* jni, const char** classes, int size); 69a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org ~ClassReferenceHolder(); 70a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org 71a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org void FreeReferences(JNIEnv* jni); 72a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org 73a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org jclass GetClass(const std::string& name); 74a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org 75a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org private: 76a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org void LoadClass(JNIEnv* jni, const std::string& name); 77a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org 78a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org std::map<std::string, jclass> classes_; 79a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org}; 80a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org 81a48c91dfb4588346b42c1a47b5f8265881581648henrike@webrtc.org#endif // WEBRTC_EXAMPLES_ANDROID_MEDIA_DEMO_JNI_JNI_HELPERS_H_ 82