зеркало из https://github.com/mozilla/gecko-dev.git
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:
Родитель
d19eceacd5
Коммит
ec08814aaa
|
@ -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',
|
||||
|
|
Загрузка…
Ссылка в новой задаче