Bug 1406168 - 2. Remove AndroidJNIWrapper; r=snorp

Remove AndroidJNIWrapper. It was primarily used by JNI.jsm and WebRTC.
Usages in WebRTC are replaced with equivalent uses of JNI templates.

MozReview-Commit-ID: DPSeMOtH2wF
This commit is contained in:
Jim Chen 2017-11-01 14:48:48 -04:00
Родитель d19eceacd5
Коммит ec08814aaa
14 изменённых файлов: 48 добавлений и 220 удалений

Просмотреть файл

@ -25,7 +25,6 @@ static mozilla::LazyLogModule sGetUserMediaLog("GetUserMedia");
#ifdef MOZ_WIDGET_ANDROID
#include "VideoEngine.h"
#include "AndroidJNIWrapper.h"
#include "AndroidBridge.h"
#endif
@ -282,13 +281,9 @@ MediaEngineWebRTC::EnumerateAudioDevices(dom::MediaSourceEnum aMediaSource,
}
#ifdef MOZ_WIDGET_ANDROID
JavaVM* jvm = mozilla::jni::GetVM();
jobject context = mozilla::AndroidBridge::Bridge()->GetGlobalContextRef();
// get the JVM
JavaVM* jvm;
JNIEnv* const env = jni::GetEnvForThread();
MOZ_ALWAYS_TRUE(!env->GetJavaVM(&jvm));
if (webrtc::VoiceEngine::SetAndroidObjects(jvm, (void*)context) != 0) {
LOG(("VoiceEngine:SetAndroidObjects Failed"));
return;

Просмотреть файл

@ -28,7 +28,7 @@
#include "webrtc/system_wrappers/include/clock.h"
#ifdef MOZ_WIDGET_ANDROID
#include "AndroidJNIWrapper.h"
#include "AndroidBridge.h"
#endif
namespace mozilla {
@ -293,14 +293,13 @@ MediaConduitErrorCode WebrtcAudioConduit::Init()
CSFLogDebug(LOGTAG, "%s this=%p", __FUNCTION__, this);
#ifdef MOZ_WIDGET_ANDROID
jobject context = jsjni_GetGlobalContextRef();
// get the JVM
JavaVM *jvm = jsjni_GetVM();
JavaVM* jvm = mozilla::jni::GetVM();
jobject context = mozilla::AndroidBridge::Bridge()->GetGlobalContextRef();
if (webrtc::VoiceEngine::SetAndroidObjects(jvm, (void*)context) != 0) {
CSFLogError(LOGTAG, "%s Unable to set Android objects", __FUNCTION__);
return kMediaConduitSessionNotInited;
}
if (webrtc::VoiceEngine::SetAndroidObjects(jvm, (void*)context) != 0) {
CSFLogError(LOGTAG, "%s Unable to set Android objects", __FUNCTION__);
return kMediaConduitSessionNotInited;
}
#endif
// Per WebRTC APIs below function calls return nullptr on failure

Просмотреть файл

@ -42,7 +42,6 @@
#include "mozilla/Unused.h"
#if defined(MOZ_WIDGET_ANDROID)
#include "AndroidJNIWrapper.h"
#include "VideoEngine.h"
#endif
@ -1159,8 +1158,7 @@ WebrtcVideoConduit::InitMain()
}
}
#ifdef MOZ_WIDGET_ANDROID
// get the JVM
JavaVM *jvm = jsjni_GetVM();
JavaVM* jvm = mozilla::jni::GetVM();
if (mozilla::camera::VideoEngine::SetAndroidObjects(jvm) != 0) {
CSFLogError(LOGTAG, "%s: could not set Android objects", __FUNCTION__);

Просмотреть файл

@ -12,7 +12,6 @@
#include "JavaCallbacksSupport.h"
#include "MediaCodec.h"
#include "WebrtcMediaCodecVP8VideoCodec.h"
#include "AndroidJNIWrapper.h"
#include "mozilla/ArrayUtils.h"
#include "nsThreadUtils.h"
#include "mozilla/Monitor.h"
@ -443,7 +442,7 @@ public:
size_t size = inputImage._length;
JNIEnv* env = jsjni_GetJNIForThread();
JNIEnv* const env = jni::GetEnvForThread();
jobject buffer = env->GetObjectArrayElement(mInputBuffers, inputIndex);
void* directBuffer = env->GetDirectBufferAddress(buffer);
@ -520,7 +519,7 @@ public:
return NS_OK;
}
JNIEnv* env = jsjni_GetJNIForThread();
JNIEnv* const env = jni::GetEnvForThread();
jobject buffer = env->GetObjectArrayElement(mOutputBuffers, outputIndex);
if (buffer) {
// The buffer will be null on Android L if we are decoding to a Surface
@ -582,7 +581,7 @@ public:
}
jobjectArray GetInputBuffers() {
JNIEnv* env = jsjni_GetJNIForThread();
JNIEnv* const env = jni::GetEnvForThread();
if (mInputBuffers) {
env->DeleteGlobalRef(mInputBuffers);
@ -602,7 +601,7 @@ public:
}
jobjectArray GetOutputBuffers() {
JNIEnv* env = jsjni_GetJNIForThread();
JNIEnv* const env = jni::GetEnvForThread();
if (mOutputBuffers) {
env->DeleteGlobalRef(mOutputBuffers);
@ -825,7 +824,7 @@ int32_t WebrtcMediaCodecVP8VideoEncoder::Encode(
#endif
if (inputIndex >= 0) {
JNIEnv* env = jsjni_GetJNIForThread();
JNIEnv* const env = jni::GetEnvForThread();
jobject buffer = env->GetObjectArrayElement(mInputBuffers, inputIndex);
void* directBuffer = env->GetDirectBufferAddress(buffer);
@ -881,7 +880,7 @@ int32_t WebrtcMediaCodecVP8VideoEncoder::Encode(
CSFLogDebug(LOGTAG, "%s dequeue output buffer return status is %d took %u ms", __FUNCTION__, outputIndex, PR_IntervalToMilliseconds(PR_IntervalNow()-time));
#endif
JNIEnv* env = jsjni_GetJNIForThread();
JNIEnv* const env = jni::GetEnvForThread();
jobject buffer = env->GetObjectArrayElement(mOutputBuffers, outputIndex);
if (buffer) {
int32_t offset;

Просмотреть файл

@ -14,8 +14,6 @@
#include <android/log.h>
#include "AndroidJNIWrapper.h"
#include "webrtc/base/arraysize.h"
#include "webrtc/base/checks.h"
#include "webrtc/modules/audio_device/android/audio_common.h"

Просмотреть файл

@ -15,7 +15,12 @@
#include "webrtc/modules/utility/include/jvm_android.h"
#include "webrtc/base/checks.h"
#include "AndroidJNIWrapper.h"
namespace mozilla {
namespace jni {
jclass GetClassRef(JNIEnv* aEnv, const char* aClassName);
}
}
#define TAG "JVM"
#define ALOGD(...) __android_log_print(ANDROID_LOG_DEBUG, TAG, __VA_ARGS__)
@ -44,9 +49,10 @@ void LoadClasses(JNIEnv* jni) {
ALOGD("LoadClasses");
for (auto& c : loaded_classes) {
ALOGD("name: %s", c.name);
jclass globalRef = jsjni_GetGlobalClassRef(c.name);
RTC_CHECK(globalRef) << c.name;
c.clazz = globalRef;
jclass clsRef = mozilla::jni::GetClassRef(jni, c.name);
RTC_CHECK(clsRef) << c.name;
c.clazz = static_cast<jclass>(jni->NewGlobalRef(clsRef));
jni->DeleteLocalRef(clsRef);
}
}

Просмотреть файл

@ -20,7 +20,7 @@
#include "webrtc/system_wrappers/include/logging.h"
#include "webrtc/system_wrappers/include/trace.h"
#include "AndroidJNIWrapper.h"
#include "mozilla/jni/Utils.h"
namespace webrtc {
@ -113,10 +113,10 @@ void DeviceInfoAndroid::BuildDeviceList() {
JNIEnv* jni = ats.env();
g_camera_info = new std::vector<AndroidCameraInfo>();
jclass j_info_class =
jsjni_GetGlobalClassRef("org/webrtc/videoengine/VideoCaptureDeviceInfoAndroid");
jclass j_cap_class =
jsjni_GetGlobalClassRef("org/webrtc/videoengine/CaptureCapabilityAndroid");
jclass j_info_class = mozilla::jni::GetClassRef(
jni, "org/webrtc/videoengine/VideoCaptureDeviceInfoAndroid");
jclass j_cap_class = mozilla::jni::GetClassRef(
jni, "org/webrtc/videoengine/CaptureCapabilityAndroid");
assert(j_info_class);
jmethodID j_initialize = jni->GetStaticMethodID(
j_info_class, "getDeviceInfo",
@ -184,8 +184,8 @@ void DeviceInfoAndroid::BuildDeviceList() {
jni->ReleaseIntArrayElements(heightResArray, heights, JNI_ABORT);
}
jni->DeleteGlobalRef(j_info_class);
jni->DeleteGlobalRef(j_cap_class);
jni->DeleteLocalRef(j_info_class);
jni->DeleteLocalRef(j_cap_class);
}
void DeviceInfoAndroid::DeInitialize() {

Просмотреть файл

@ -18,7 +18,7 @@
#include "webrtc/system_wrappers/include/logging.h"
#include "webrtc/system_wrappers/include/trace.h"
#include "AndroidJNIWrapper.h"
#include "AndroidBridge.h"
static JavaVM* g_jvm_capture = NULL;
static jclass g_java_capturer_class = NULL; // VideoCaptureAndroid.class.
@ -64,12 +64,15 @@ int32_t SetCaptureAndroidVM(JavaVM* javaVM) {
g_jvm_capture = javaVM;
AttachThreadScoped ats(g_jvm_capture);
g_context = jsjni_GetGlobalContextRef();
g_context = mozilla::AndroidBridge::Bridge()->GetGlobalContextRef();
videocapturemodule::DeviceInfoAndroid::Initialize(g_jvm_capture);
jclass clsRef = mozilla::jni::GetClassRef(
ats.env(), "org/webrtc/videoengine/VideoCaptureAndroid");
g_java_capturer_class =
jsjni_GetGlobalClassRef("org/webrtc/videoengine/VideoCaptureAndroid");
static_cast<jclass>(ats.env()->NewGlobalRef(clsRef));
ats.env()->DeleteLocalRef(clsRef);
assert(g_java_capturer_class);
JNINativeMethod native_methods[] = {

Просмотреть файл

@ -15,7 +15,6 @@
#include "nsXULAppAPI.h"
#include <prthread.h>
#include "AndroidBridge.h"
#include "AndroidJNIWrapper.h"
#include "AndroidBridgeUtilities.h"
#include "nsAlertsUtils.h"
#include "nsAppShell.h"

Просмотреть файл

@ -1,141 +0,0 @@
/* -*- Mode: c++; c-basic-offset: 4; tab-width: 20; indent-tabs-mode: nil; -*-
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
#include <android/log.h>
#include <dlfcn.h>
#include <prthread.h>
#include "mozilla/DebugOnly.h"
#include "mozilla/Assertions.h"
#include "mozilla/SyncRunnable.h"
#include "nsThreadUtils.h"
#include "AndroidBridge.h"
extern "C" {
jclass __jsjni_GetGlobalClassRef(const char *className);
}
class GetGlobalClassRefRunnable : public mozilla::Runnable {
public:
GetGlobalClassRefRunnable(const char *className, jclass *foundClass) :
mozilla::Runnable("GetGlobalClassRefRunnable"),
mClassName(className), mResult(foundClass) {}
NS_IMETHOD Run() override {
*mResult = __jsjni_GetGlobalClassRef(mClassName);
return NS_OK;
}
private:
const char *mClassName;
jclass *mResult;
};
extern "C" {
__attribute__ ((visibility("default")))
jclass
jsjni_FindClass(const char *className) {
// FindClass outside the main thread will run into problems due
// to missing the classpath
MOZ_ASSERT(NS_IsMainThread());
JNIEnv *env = mozilla::jni::GetGeckoThreadEnv();
return env->FindClass(className);
}
jclass
__jsjni_GetGlobalClassRef(const char *className) {
// root class globally
JNIEnv *env = mozilla::jni::GetGeckoThreadEnv();
jclass globalRef = static_cast<jclass>(env->NewGlobalRef(env->FindClass(className)));
if (!globalRef)
return nullptr;
// return the newly create global reference
return globalRef;
}
__attribute__ ((visibility("default")))
jclass
jsjni_GetGlobalClassRef(const char *className) {
if (NS_IsMainThread()) {
return __jsjni_GetGlobalClassRef(className);
}
nsCOMPtr<nsIThread> mainThread;
mozilla::DebugOnly<nsresult> rv = NS_GetMainThread(getter_AddRefs(mainThread));
MOZ_ASSERT(NS_SUCCEEDED(rv));
jclass foundClass;
nsCOMPtr<nsIRunnable> runnable_ref(new GetGlobalClassRefRunnable(className,
&foundClass));
RefPtr<mozilla::SyncRunnable> sr = new mozilla::SyncRunnable(runnable_ref);
sr->DispatchToThread(mainThread);
if (!foundClass)
return nullptr;
return foundClass;
}
__attribute__ ((visibility("default")))
jmethodID
jsjni_GetStaticMethodID(jclass methodClass,
const char *methodName,
const char *signature) {
JNIEnv *env = mozilla::jni::GetGeckoThreadEnv();
return env->GetStaticMethodID(methodClass, methodName, signature);
}
__attribute__ ((visibility("default")))
bool
jsjni_ExceptionCheck() {
JNIEnv *env = mozilla::jni::GetGeckoThreadEnv();
return env->ExceptionCheck();
}
__attribute__ ((visibility("default")))
void
jsjni_CallStaticVoidMethodA(jclass cls,
jmethodID method,
jvalue *values) {
JNIEnv *env = mozilla::jni::GetGeckoThreadEnv();
mozilla::AutoLocalJNIFrame jniFrame(env);
env->CallStaticVoidMethodA(cls, method, values);
}
__attribute__ ((visibility("default")))
int
jsjni_CallStaticIntMethodA(jclass cls,
jmethodID method,
jvalue *values) {
JNIEnv *env = mozilla::jni::GetGeckoThreadEnv();
mozilla::AutoLocalJNIFrame jniFrame(env);
return env->CallStaticIntMethodA(cls, method, values);
}
__attribute__ ((visibility("default")))
jobject jsjni_GetGlobalContextRef() {
return mozilla::AndroidBridge::Bridge()->GetGlobalContextRef();
}
__attribute__ ((visibility("default")))
JavaVM* jsjni_GetVM() {
JavaVM* jvm;
JNIEnv* const env = mozilla::jni::GetGeckoThreadEnv();
MOZ_ALWAYS_TRUE(!env->GetJavaVM(&jvm));
return jvm;
}
__attribute__ ((visibility("default")))
JNIEnv* jsjni_GetJNIForThread() {
return mozilla::jni::GetEnvForThread();
}
// For compatibility with JNI.jsm; some addons bundle their own JNI.jsm,
// so we cannot just change the function name used in JNI.jsm.
__attribute__ ((visibility("default")))
JNIEnv* GetJNIForThread() {
return mozilla::jni::GetEnvForThread();
}
}

Просмотреть файл

@ -1,34 +0,0 @@
/* -*- Mode: c++; c-basic-offset: 4; tab-width: 20; indent-tabs-mode: nil; -*-
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
#ifndef AndroidJNIWrapper_h__
#define AndroidJNIWrapper_h__
#include "mozilla/Types.h"
#include <jni.h>
#include <android/log.h>
extern "C" MOZ_EXPORT jclass jsjni_FindClass(const char *className);
/**
* JNIEnv::FindClass alternative.
* Callable from any thread, including code
* invoked via the JNI that doesn't have MOZILLA_INTERNAL_API defined.
* The caller is responsible for ensuring that the class is not leaked by
* calling DeleteGlobalRef at an appropriate time.
*/
extern "C" MOZ_EXPORT jclass jsjni_GetGlobalClassRef(const char *className);
extern "C" MOZ_EXPORT jmethodID jsjni_GetStaticMethodID(jclass methodClass,
const char *methodName,
const char *signature);
extern "C" MOZ_EXPORT bool jsjni_ExceptionCheck();
extern "C" MOZ_EXPORT void jsjni_CallStaticVoidMethodA(jclass cls, jmethodID method, jvalue *values);
extern "C" MOZ_EXPORT int jsjni_CallStaticIntMethodA(jclass cls, jmethodID method, jvalue *values);
extern "C" MOZ_EXPORT jobject jsjni_GetGlobalContextRef();
extern "C" MOZ_EXPORT JavaVM* jsjni_GetVM();
extern "C" MOZ_EXPORT JNIEnv* jsjni_GetJNIForThread();
#endif /* AndroidJNIWrapper_h__ */

Просмотреть файл

@ -72,12 +72,11 @@ template<> const char ObjectBase<TypedObject<jdoubleArray>, jdoubleArray>::name[
template<> const char ObjectBase<TypedObject<jobjectArray>, jobjectArray>::name[] = "[Ljava/lang/Object;";
template<> const char ObjectBase<ByteBuffer, jobject>::name[] = "java/nio/ByteBuffer";
JavaVM* sJavaVM;
JNIEnv* sGeckoThreadEnv;
namespace {
JavaVM* sJavaVM;
pthread_key_t sThreadEnvKey;
jclass sOOMErrorClass;
jobject sClassLoader;

Просмотреть файл

@ -63,6 +63,7 @@ enum class DispatchTarget
};
extern JavaVM* sJavaVM;
extern JNIEnv* sGeckoThreadEnv;
inline bool IsAvailable()
@ -70,6 +71,14 @@ inline bool IsAvailable()
return !!sGeckoThreadEnv;
}
inline JavaVM* GetVM()
{
#ifdef MOZ_CHECK_JNI
MOZ_ASSERT(sJavaVM);
#endif
return sJavaVM;
}
inline JNIEnv* GetGeckoThreadEnv()
{
#ifdef MOZ_CHECK_JNI

Просмотреть файл

@ -25,7 +25,6 @@ XPIDL_MODULE = 'widget_android'
EXPORTS += [
'AndroidBridge.h',
'AndroidJavaWrappers.h',
'AndroidJNIWrapper.h',
'GeneratedJNINatives.h',
'GeneratedJNIWrappers.h',
]
@ -42,7 +41,6 @@ UNIFIED_SOURCES += [
'AndroidContentController.cpp',
'AndroidJavaWrappers.cpp',
'AndroidJNI.cpp',
'AndroidJNIWrapper.cpp',
'AndroidUiThread.cpp',
'ANRReporter.cpp',
'EventDispatcher.cpp',