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