Flutter Engine
 
Loading...
Searching...
No Matches
fml::jni Namespace Reference

Classes

class  JavaObjectWeakGlobalRef
 
class  JavaRef
 
class  JavaRef< jobject >
 
struct  JNIDetach
 
class  ScopedJavaGlobalRef
 
class  ScopedJavaLocalFrame
 
class  ScopedJavaLocalRef
 

Functions

void InitJavaVM (JavaVM *vm)
 
JNIEnv * AttachCurrentThread ()
 
void DetachFromVM ()
 
std::string JavaStringToString (JNIEnv *env, jstring str)
 
ScopedJavaLocalRef< jstring > StringToJavaString (JNIEnv *env, const std::string &u8_string)
 
std::vector< std::string > StringArrayToVector (JNIEnv *env, jobjectArray array)
 
std::vector< std::string > StringListToVector (JNIEnv *env, jobject list)
 
ScopedJavaLocalRef< jobjectArray > VectorToStringArray (JNIEnv *env, const std::vector< std::string > &vector)
 
ScopedJavaLocalRef< jobjectArray > VectorToBufferArray (JNIEnv *env, const std::vector< std::vector< uint8_t > > &vector)
 
bool HasException (JNIEnv *env)
 
bool ClearException (JNIEnv *env, bool silent)
 
bool CheckException (JNIEnv *env)
 
std::string GetJavaExceptionInfo (JNIEnv *env, jthrowable java_throwable)
 
ScopedJavaLocalRef< jobject > GetRealObject (JNIEnv *env, jweak obj)
 

Variables

static JavaVM * g_jvm = nullptr
 
static thread_local std::unique_ptr< JNIDetachtls_jni_detach
 
static const int kDefaultLocalFrameCapacity = 16
 

Function Documentation

◆ AttachCurrentThread()

JNIEnv * fml::jni::AttachCurrentThread ( )

Definition at line 34 of file jni_util.cc.

34 {
35 FML_DCHECK(g_jvm != nullptr)
36 << "Trying to attach to current thread without calling InitJavaVM first.";
37
38 JNIEnv* env = nullptr;
39 if (g_jvm->GetEnv(reinterpret_cast<void**>(&env), JNI_VERSION_1_4) ==
40 JNI_OK) {
41 return env;
42 }
43
44 JavaVMAttachArgs args;
45 args.version = JNI_VERSION_1_4;
46 args.group = nullptr;
47 // 16 is the maximum size for thread names on Android.
48 char thread_name[16];
49 int err = prctl(PR_GET_NAME, thread_name);
50 if (err < 0) {
51 args.name = nullptr;
52 } else {
53 args.name = thread_name;
54 }
55 [[maybe_unused]] jint ret = g_jvm->AttachCurrentThread(&env, &args);
56 FML_DCHECK(JNI_OK == ret);
57
58 FML_DCHECK(tls_jni_detach.get() == nullptr);
59 tls_jni_detach.reset(new JNIDetach());
60
61 return env;
62}
G_BEGIN_DECLS G_MODULE_EXPORT FlValue * args
#define FML_DCHECK(condition)
Definition logging.h:122
static thread_local std::unique_ptr< JNIDetach > tls_jni_detach
Definition jni_util.cc:27
static JavaVM * g_jvm
Definition jni_util.cc:18

References args, FML_DCHECK, g_jvm, and tls_jni_detach.

Referenced by flutter::ImageExternalTexture::AcquireLatestImage(), flutter::ImageExternalTexture::AHardwareBufferFor(), flutter::PlatformViewAndroidJNIImpl::applyTransaction(), flutter::PlatformViewAndroidJNIImpl::createOverlaySurface2(), flutter::PlatformViewAndroidJNIImpl::createTransaction(), flutter::PlatformViewAndroidJNIImpl::destroyOverlaySurface2(), flutter::PlatformViewAndroidJNIImpl::FlutterViewBeginFrame(), flutter::PlatformViewAndroidJNIImpl::FlutterViewComputePlatformResolvedLocale(), flutter::PlatformViewAndroidJNIImpl::FlutterViewCreateOverlaySurface(), flutter::PlatformViewAndroidJNIImpl::FlutterViewDestroyOverlaySurfaces(), flutter::PlatformViewAndroidJNIImpl::FlutterViewDisplayOverlaySurface(), flutter::PlatformViewAndroidJNIImpl::FlutterViewEndFrame(), flutter::PlatformViewAndroidJNIImpl::FlutterViewGetScaledFontSize(), flutter::PlatformViewAndroidJNIImpl::FlutterViewHandlePlatformMessage(), flutter::PlatformViewAndroidJNIImpl::FlutterViewHandlePlatformMessageResponse(), flutter::PlatformViewAndroidJNIImpl::FlutterViewOnDisplayPlatformView(), flutter::PlatformViewAndroidJNIImpl::FlutterViewOnFirstFrame(), flutter::PlatformViewAndroidJNIImpl::FlutterViewOnPreEngineRestart(), flutter::PlatformViewAndroidJNIImpl::FlutterViewSetApplicationLocale(), flutter::PlatformViewAndroidJNIImpl::FlutterViewUpdateCustomAccessibilityActions(), flutter::PlatformViewAndroidJNIImpl::FlutterViewUpdateSemantics(), flutter::PlatformViewAndroidJNIImpl::GetDisplayDensity(), flutter::PlatformViewAndroidJNIImpl::GetDisplayHeight(), flutter::PlatformViewAndroidJNIImpl::GetDisplayRefreshRate(), flutter::PlatformViewAndroidJNIImpl::GetDisplayWidth(), flutter::PlatformViewAndroidJNIImpl::HardwareBufferClose(), flutter::PlatformViewAndroidJNIImpl::hideOverlaySurface2(), flutter::PlatformViewAndroidJNIImpl::hidePlatformView2(), flutter::PlatformViewAndroidJNIImpl::ImageClose(), flutter::PlatformViewAndroidJNIImpl::ImageGetHardwareBuffer(), flutter::PlatformViewAndroidJNIImpl::ImageProducerTextureEntryAcquireLatestImage(), JNI_OnLoad(), flutter::PlatformViewAndroidJNIImpl::onDisplayPlatformView2(), flutter::PlatformViewAndroidJNIImpl::onEndFrame2(), flutter::PlatformViewAndroidJNIImpl::RequestDartDeferredLibrary(), fml::jni::JavaObjectWeakGlobalRef::reset(), fml::jni::JavaRef< jobject >::ResetGlobalRef(), fml::jni::JavaRef< jobject >::ResetLocalRef(), fml::jni::JavaRef< jobject >::SetNewGlobalRef(), fml::jni::JavaRef< jobject >::SetNewLocalRef(), flutter::PlatformViewAndroidJNIImpl::showOverlaySurface2(), flutter::PlatformViewAndroidJNIImpl::SurfaceTextureAttachToGLContext(), flutter::PlatformViewAndroidJNIImpl::SurfaceTextureDetachFromGLContext(), flutter::PlatformViewAndroidJNIImpl::SurfaceTextureGetTransformMatrix(), flutter::PlatformViewAndroidJNIImpl::SurfaceTextureShouldUpdate(), flutter::PlatformViewAndroidJNIImpl::SurfaceTextureUpdateTexImage(), and flutter::PlatformViewAndroidJNIImpl::swapTransaction().

◆ CheckException()

bool fml::jni::CheckException ( JNIEnv *  env)

Definition at line 199 of file jni_util.cc.

199 {
200 if (!HasException(env)) {
201 return true;
202 }
203
204 jthrowable exception = env->ExceptionOccurred();
205 env->ExceptionClear();
206 FML_LOG(ERROR) << fml::jni::GetJavaExceptionInfo(env, exception);
207 env->DeleteLocalRef(exception);
208 return false;
209}
#define FML_LOG(severity)
Definition logging.h:101
std::string GetJavaExceptionInfo(JNIEnv *env, jthrowable java_throwable)
Definition jni_util.cc:211
bool HasException(JNIEnv *env)
Definition jni_util.cc:184

References FML_LOG, GetJavaExceptionInfo(), and HasException().

Referenced by flutter::PlatformViewAndroidJNIImpl::applyTransaction(), flutter::PlatformViewAndroidJNIImpl::createOverlaySurface2(), flutter::PlatformViewAndroidJNIImpl::createTransaction(), flutter::PlatformViewAndroidJNIImpl::destroyOverlaySurface2(), flutter::PlatformViewAndroidJNIImpl::FlutterViewBeginFrame(), flutter::PlatformViewAndroidJNIImpl::FlutterViewComputePlatformResolvedLocale(), flutter::PlatformViewAndroidJNIImpl::FlutterViewCreateOverlaySurface(), flutter::PlatformViewAndroidJNIImpl::FlutterViewDestroyOverlaySurfaces(), flutter::PlatformViewAndroidJNIImpl::FlutterViewDisplayOverlaySurface(), flutter::PlatformViewAndroidJNIImpl::FlutterViewEndFrame(), flutter::PlatformViewAndroidJNIImpl::FlutterViewGetScaledFontSize(), flutter::PlatformViewAndroidJNIImpl::FlutterViewHandlePlatformMessage(), flutter::PlatformViewAndroidJNIImpl::FlutterViewHandlePlatformMessageResponse(), flutter::PlatformViewAndroidJNIImpl::FlutterViewOnDisplayPlatformView(), flutter::PlatformViewAndroidJNIImpl::FlutterViewOnFirstFrame(), flutter::PlatformViewAndroidJNIImpl::FlutterViewOnPreEngineRestart(), flutter::PlatformViewAndroidJNIImpl::FlutterViewSetApplicationLocale(), flutter::PlatformViewAndroidJNIImpl::FlutterViewUpdateCustomAccessibilityActions(), flutter::PlatformViewAndroidJNIImpl::FlutterViewUpdateSemantics(), flutter::PlatformViewAndroidJNIImpl::HardwareBufferClose(), flutter::PlatformViewAndroidJNIImpl::hideOverlaySurface2(), flutter::PlatformViewAndroidJNIImpl::ImageClose(), flutter::PlatformViewAndroidJNIImpl::ImageGetHardwareBuffer(), flutter::PlatformViewAndroidJNIImpl::ImageProducerTextureEntryAcquireLatestImage(), flutter::PlatformViewAndroidJNIImpl::onDisplayPlatformView2(), flutter::PlatformViewAndroidJNIImpl::onEndFrame2(), flutter::PlatformViewAndroid::Register(), flutter::PlatformViewAndroidJNIImpl::RequestDartDeferredLibrary(), flutter::PlatformViewAndroidJNIImpl::showOverlaySurface2(), flutter::PlatformViewAndroidJNIImpl::SurfaceTextureAttachToGLContext(), flutter::PlatformViewAndroidJNIImpl::SurfaceTextureDetachFromGLContext(), flutter::PlatformViewAndroidJNIImpl::SurfaceTextureGetTransformMatrix(), flutter::PlatformViewAndroidJNIImpl::SurfaceTextureShouldUpdate(), flutter::PlatformViewAndroidJNIImpl::SurfaceTextureUpdateTexImage(), and flutter::PlatformViewAndroidJNIImpl::swapTransaction().

◆ ClearException()

bool fml::jni::ClearException ( JNIEnv *  env,
bool  silent 
)

Definition at line 188 of file jni_util.cc.

188 {
189 if (!HasException(env)) {
190 return false;
191 }
192 if (!silent) {
193 env->ExceptionDescribe();
194 }
195 env->ExceptionClear();
196 return true;
197}

References HasException().

Referenced by GetJavaExceptionInfo(), and flutter::PlatformViewAndroid::Register().

◆ DetachFromVM()

void fml::jni::DetachFromVM ( )

Definition at line 64 of file jni_util.cc.

64 {
65 if (g_jvm) {
66 g_jvm->DetachCurrentThread();
67 }
68}

References g_jvm.

Referenced by fml::jni::JNIDetach::~JNIDetach().

◆ GetJavaExceptionInfo()

std::string fml::jni::GetJavaExceptionInfo ( JNIEnv *  env,
jthrowable  java_throwable 
)

Definition at line 211 of file jni_util.cc.

211 {
212 ScopedJavaLocalRef<jclass> throwable_clazz(
213 env, env->FindClass("java/lang/Throwable"));
214 jmethodID throwable_printstacktrace = env->GetMethodID(
215 throwable_clazz.obj(), "printStackTrace", "(Ljava/io/PrintStream;)V");
216
217 // Create an instance of ByteArrayOutputStream.
218 ScopedJavaLocalRef<jclass> bytearray_output_stream_clazz(
219 env, env->FindClass("java/io/ByteArrayOutputStream"));
220 jmethodID bytearray_output_stream_constructor =
221 env->GetMethodID(bytearray_output_stream_clazz.obj(), "<init>", "()V");
222 jmethodID bytearray_output_stream_tostring = env->GetMethodID(
223 bytearray_output_stream_clazz.obj(), "toString", "()Ljava/lang/String;");
224 ScopedJavaLocalRef<jobject> bytearray_output_stream(
225 env, env->NewObject(bytearray_output_stream_clazz.obj(),
226 bytearray_output_stream_constructor));
227
228 // Create an instance of PrintStream.
229 ScopedJavaLocalRef<jclass> printstream_clazz(
230 env, env->FindClass("java/io/PrintStream"));
231 jmethodID printstream_constructor = env->GetMethodID(
232 printstream_clazz.obj(), "<init>", "(Ljava/io/OutputStream;)V");
233 ScopedJavaLocalRef<jobject> printstream(
234 env, env->NewObject(printstream_clazz.obj(), printstream_constructor,
235 bytearray_output_stream.obj()));
236
237 // Call Throwable.printStackTrace(PrintStream)
238 env->CallVoidMethod(java_throwable, throwable_printstacktrace,
239 printstream.obj());
240
241 // Call ByteArrayOutputStream.toString()
242 ScopedJavaLocalRef<jstring> exception_string(
243 env,
244 static_cast<jstring>(env->CallObjectMethod(
245 bytearray_output_stream.obj(), bytearray_output_stream_tostring)));
246 if (ClearException(env)) {
247 return "Java OOM'd in exception handling, check logcat";
248 }
249
250 return JavaStringToString(env, exception_string.obj());
251}
bool ClearException(JNIEnv *env, bool silent)
Definition jni_util.cc:188

References ClearException(), JavaStringToString(), and fml::jni::JavaRef< T >::obj().

Referenced by CheckException().

◆ GetRealObject()

ScopedJavaLocalRef< jobject > fml::jni::GetRealObject ( JNIEnv *  env,
jweak  obj 
)

Definition at line 45 of file jni_weak_ref.cc.

45 {
46 jobject real = NULL;
47 if (obj) {
48 real = env->NewLocalRef(obj);
49 if (!real) {
50 FML_DLOG(ERROR) << "The real object has been deleted!";
51 }
52 }
53 return ScopedJavaLocalRef<jobject>(env, real);
54}
#define FML_DLOG(severity)
Definition logging.h:121

References FML_DLOG.

Referenced by fml::jni::JavaObjectWeakGlobalRef::get().

◆ HasException()

bool fml::jni::HasException ( JNIEnv *  env)

Definition at line 184 of file jni_util.cc.

184 {
185 return env->ExceptionCheck() != JNI_FALSE;
186}

Referenced by CheckException(), and ClearException().

◆ InitJavaVM()

void fml::jni::InitJavaVM ( JavaVM *  vm)

Definition at line 29 of file jni_util.cc.

29 {
30 FML_DCHECK(g_jvm == nullptr);
31 g_jvm = vm;
32}

References FML_DCHECK, and g_jvm.

Referenced by JNI_OnLoad().

◆ JavaStringToString()

std::string fml::jni::JavaStringToString ( JNIEnv *  env,
jstring  str 
)

Definition at line 70 of file jni_util.cc.

70 {
71 if (env == nullptr || str == nullptr) {
72 return "";
73 }
74 const jchar* chars = env->GetStringChars(str, NULL);
75 if (chars == nullptr) {
76 return "";
77 }
78 std::u16string u16_string(reinterpret_cast<const char16_t*>(chars),
79 env->GetStringLength(str));
80 std::string u8_string = Utf16ToUtf8(u16_string);
81 env->ReleaseStringChars(str, chars);
83 return u8_string;
84}
#define ASSERT_NO_EXCEPTION()
Definition jni_util.cc:20

References ASSERT_NO_EXCEPTION, and fml::Utf16ToUtf8().

Referenced by flutter::DeferredComponentInstallFailure(), flutter::DispatchEmptyPlatformMessage(), flutter::DispatchPlatformMessage(), flutter::PlatformViewAndroidJNIImpl::FlutterViewComputePlatformResolvedLocale(), GetJavaExceptionInfo(), flutter::RunBundleAndSnapshotFromLibrary(), flutter::SpawnJNI(), StringArrayToVector(), StringListToVector(), and flutter::UpdateJavaAssetManager().

◆ StringArrayToVector()

std::vector< std::string > fml::jni::StringArrayToVector ( JNIEnv *  env,
jobjectArray  array 
)

Definition at line 96 of file jni_util.cc.

96 {
97 std::vector<std::string> out;
98 if (env == nullptr || array == nullptr) {
99 return out;
100 }
101
102 jsize length = env->GetArrayLength(array);
103
104 if (length == -1) {
105 return out;
106 }
107
108 out.resize(length);
109 for (jsize i = 0; i < length; ++i) {
110 ScopedJavaLocalRef<jstring> java_string(
111 env, static_cast<jstring>(env->GetObjectArrayElement(array, i)));
112 out[i] = JavaStringToString(env, java_string.obj());
113 }
114
115 return out;
116}
size_t length

References i, JavaStringToString(), length, and fml::jni::JavaRef< T >::obj().

Referenced by flutter::LoadDartDeferredLibrary().

◆ StringListToVector()

std::vector< std::string > fml::jni::StringListToVector ( JNIEnv *  env,
jobject  list 
)

Definition at line 118 of file jni_util.cc.

118 {
119 std::vector<std::string> out;
120 if (env == nullptr || list == nullptr) {
121 return out;
122 }
123
124 ScopedJavaLocalRef<jclass> list_clazz(env, env->FindClass("java/util/List"));
125 FML_DCHECK(!list_clazz.is_null());
126
127 jmethodID list_get =
128 env->GetMethodID(list_clazz.obj(), "get", "(I)Ljava/lang/Object;");
129 jmethodID list_size = env->GetMethodID(list_clazz.obj(), "size", "()I");
130
131 jint size = env->CallIntMethod(list, list_size);
132
133 if (size == 0) {
134 return out;
135 }
136
137 out.resize(size);
138 for (jint i = 0; i < size; ++i) {
139 ScopedJavaLocalRef<jstring> java_string(
140 env, static_cast<jstring>(env->CallObjectMethod(list, list_get, i)));
141 out[i] = JavaStringToString(env, java_string.obj());
142 }
143
144 return out;
145}

References FML_DCHECK, i, JavaStringToString(), and fml::jni::JavaRef< T >::obj().

Referenced by flutter::RunBundleAndSnapshotFromLibrary(), and flutter::SpawnJNI().

◆ StringToJavaString()

ScopedJavaLocalRef< jstring > fml::jni::StringToJavaString ( JNIEnv *  env,
const std::string &  u8_string 
)

Definition at line 86 of file jni_util.cc.

87 {
88 std::u16string u16_string = Utf8ToUtf16(u8_string);
89 auto result = ScopedJavaLocalRef<jstring>(
90 env, env->NewString(reinterpret_cast<const jchar*>(u16_string.data()),
91 u16_string.length()));
93 return result;
94}
std::u16string Utf8ToUtf16(const std::string_view string)

References ASSERT_NO_EXCEPTION, and fml::Utf8ToUtf16().

Referenced by flutter::PlatformViewAndroidJNIImpl::FlutterViewHandlePlatformMessage(), flutter::PlatformViewAndroidJNIImpl::FlutterViewSetApplicationLocale(), and VectorToStringArray().

◆ VectorToBufferArray()

ScopedJavaLocalRef< jobjectArray > fml::jni::VectorToBufferArray ( JNIEnv *  env,
const std::vector< std::vector< uint8_t > > &  vector 
)

Definition at line 164 of file jni_util.cc.

166 {
167 FML_DCHECK(env);
168 ScopedJavaLocalRef<jclass> byte_buffer_clazz(
169 env, env->FindClass("java/nio/ByteBuffer"));
170 FML_DCHECK(!byte_buffer_clazz.is_null());
171 jobjectArray java_array =
172 env->NewObjectArray(vector.size(), byte_buffer_clazz.obj(), NULL);
174 for (size_t i = 0; i < vector.size(); ++i) {
175 uint8_t* data = const_cast<uint8_t*>(vector[i].data());
177 env, env->NewDirectByteBuffer(reinterpret_cast<void*>(data),
178 vector[i].size()));
179 env->SetObjectArrayElement(java_array, i, item.obj());
180 }
181 return ScopedJavaLocalRef<jobjectArray>(env, java_array);
182}
std::shared_ptr< const fml::Mapping > data

References ASSERT_NO_EXCEPTION, data, FML_DCHECK, i, and fml::jni::JavaRef< T >::obj().

Referenced by flutter::PlatformViewAndroidJNIImpl::FlutterViewUpdateSemantics().

◆ VectorToStringArray()

ScopedJavaLocalRef< jobjectArray > fml::jni::VectorToStringArray ( JNIEnv *  env,
const std::vector< std::string > &  vector 
)

Definition at line 147 of file jni_util.cc.

149 {
150 FML_DCHECK(env);
151 ScopedJavaLocalRef<jclass> string_clazz(env,
152 env->FindClass("java/lang/String"));
153 FML_DCHECK(!string_clazz.is_null());
154 jobjectArray java_array =
155 env->NewObjectArray(vector.size(), string_clazz.obj(), NULL);
157 for (size_t i = 0; i < vector.size(); ++i) {
159 env->SetObjectArrayElement(java_array, i, item.obj());
160 }
161 return ScopedJavaLocalRef<jobjectArray>(env, java_array);
162}
ScopedJavaLocalRef< jstring > StringToJavaString(JNIEnv *env, const std::string &u8_string)
Definition jni_util.cc:86

References ASSERT_NO_EXCEPTION, FML_DCHECK, i, fml::jni::JavaRef< T >::obj(), and StringToJavaString().

Referenced by flutter::PlatformViewAndroidJNIImpl::FlutterViewComputePlatformResolvedLocale(), flutter::PlatformViewAndroidJNIImpl::FlutterViewUpdateCustomAccessibilityActions(), and flutter::PlatformViewAndroidJNIImpl::FlutterViewUpdateSemantics().

Variable Documentation

◆ g_jvm

JavaVM* fml::jni::g_jvm = nullptr
static

Definition at line 18 of file jni_util.cc.

Referenced by AttachCurrentThread(), DetachFromVM(), and InitJavaVM().

◆ kDefaultLocalFrameCapacity

const int fml::jni::kDefaultLocalFrameCapacity = 16
static

◆ tls_jni_detach

thread_local std::unique_ptr<JNIDetach> fml::jni::tls_jni_detach
static

Definition at line 27 of file jni_util.cc.

Referenced by AttachCurrentThread().