xref: /aosp_15_r20/external/cronet/base/android/jni_android.h (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
1*6777b538SAndroid Build Coastguard Worker // Copyright 2012 The Chromium Authors
2*6777b538SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*6777b538SAndroid Build Coastguard Worker // found in the LICENSE file.
4*6777b538SAndroid Build Coastguard Worker 
5*6777b538SAndroid Build Coastguard Worker #ifndef BASE_ANDROID_JNI_ANDROID_H_
6*6777b538SAndroid Build Coastguard Worker #define BASE_ANDROID_JNI_ANDROID_H_
7*6777b538SAndroid Build Coastguard Worker 
8*6777b538SAndroid Build Coastguard Worker #include <jni.h>
9*6777b538SAndroid Build Coastguard Worker #include <sys/types.h>
10*6777b538SAndroid Build Coastguard Worker 
11*6777b538SAndroid Build Coastguard Worker #include <atomic>
12*6777b538SAndroid Build Coastguard Worker #include <string>
13*6777b538SAndroid Build Coastguard Worker 
14*6777b538SAndroid Build Coastguard Worker #include "base/android/scoped_java_ref.h"
15*6777b538SAndroid Build Coastguard Worker #include "base/auto_reset.h"
16*6777b538SAndroid Build Coastguard Worker #include "base/base_export.h"
17*6777b538SAndroid Build Coastguard Worker #include "base/compiler_specific.h"
18*6777b538SAndroid Build Coastguard Worker #include "base/debug/debugging_buildflags.h"
19*6777b538SAndroid Build Coastguard Worker #include "base/debug/stack_trace.h"
20*6777b538SAndroid Build Coastguard Worker #include "third_party/jni_zero/jni_zero.h"
21*6777b538SAndroid Build Coastguard Worker 
22*6777b538SAndroid Build Coastguard Worker namespace base {
23*6777b538SAndroid Build Coastguard Worker namespace android {
24*6777b538SAndroid Build Coastguard Worker 
25*6777b538SAndroid Build Coastguard Worker // Used to mark symbols to be exported in a shared library's symbol table.
26*6777b538SAndroid Build Coastguard Worker #define JNI_EXPORT __attribute__ ((visibility("default")))
27*6777b538SAndroid Build Coastguard Worker 
28*6777b538SAndroid Build Coastguard Worker // Contains the registration method information for initializing JNI bindings.
29*6777b538SAndroid Build Coastguard Worker struct RegistrationMethod {
30*6777b538SAndroid Build Coastguard Worker   const char* name;
31*6777b538SAndroid Build Coastguard Worker   bool (*func)(JNIEnv* env);
32*6777b538SAndroid Build Coastguard Worker };
33*6777b538SAndroid Build Coastguard Worker 
34*6777b538SAndroid Build Coastguard Worker using LogFatalCallback = void (*)(const char* message);
35*6777b538SAndroid Build Coastguard Worker 
36*6777b538SAndroid Build Coastguard Worker BASE_EXPORT extern LogFatalCallback g_log_fatal_callback_for_testing;
37*6777b538SAndroid Build Coastguard Worker BASE_EXPORT extern const char kUnableToGetStackTraceMessage[];
38*6777b538SAndroid Build Coastguard Worker BASE_EXPORT extern const char kReetrantOutOfMemoryMessage[];
39*6777b538SAndroid Build Coastguard Worker BASE_EXPORT extern const char kReetrantExceptionMessage[];
40*6777b538SAndroid Build Coastguard Worker BASE_EXPORT extern const char kUncaughtExceptionMessage[];
41*6777b538SAndroid Build Coastguard Worker BASE_EXPORT extern const char kUncaughtExceptionHandlerFailedMessage[];
42*6777b538SAndroid Build Coastguard Worker BASE_EXPORT extern const char kOomInGetJavaExceptionInfoMessage[];
43*6777b538SAndroid Build Coastguard Worker 
44*6777b538SAndroid Build Coastguard Worker // Attaches the current thread to the VM (if necessary) and return the JNIEnv*.
AttachCurrentThread()45*6777b538SAndroid Build Coastguard Worker inline JNIEnv* AttachCurrentThread() {
46*6777b538SAndroid Build Coastguard Worker   return jni_zero::AttachCurrentThread();
47*6777b538SAndroid Build Coastguard Worker }
48*6777b538SAndroid Build Coastguard Worker 
49*6777b538SAndroid Build Coastguard Worker // Same to AttachCurrentThread except that thread name will be set to
50*6777b538SAndroid Build Coastguard Worker // |thread_name| if it is the first call. Otherwise, thread_name won't be
51*6777b538SAndroid Build Coastguard Worker // changed. AttachCurrentThread() doesn't regard underlying platform thread
52*6777b538SAndroid Build Coastguard Worker // name, but just resets it to "Thread-???". This function should be called
53*6777b538SAndroid Build Coastguard Worker // right after new thread is created if it is important to keep thread name.
AttachCurrentThreadWithName(const std::string & thread_name)54*6777b538SAndroid Build Coastguard Worker inline JNIEnv* AttachCurrentThreadWithName(const std::string& thread_name) {
55*6777b538SAndroid Build Coastguard Worker   return jni_zero::AttachCurrentThreadWithName(thread_name);
56*6777b538SAndroid Build Coastguard Worker }
57*6777b538SAndroid Build Coastguard Worker 
58*6777b538SAndroid Build Coastguard Worker // Detaches the current thread from VM if it is attached.
DetachFromVM()59*6777b538SAndroid Build Coastguard Worker inline void DetachFromVM() {
60*6777b538SAndroid Build Coastguard Worker   jni_zero::DetachFromVM();
61*6777b538SAndroid Build Coastguard Worker }
62*6777b538SAndroid Build Coastguard Worker 
63*6777b538SAndroid Build Coastguard Worker // Initializes the global JVM.
64*6777b538SAndroid Build Coastguard Worker BASE_EXPORT void InitVM(JavaVM* vm);
65*6777b538SAndroid Build Coastguard Worker 
66*6777b538SAndroid Build Coastguard Worker // Returns true if the global JVM has been initialized.
IsVMInitialized()67*6777b538SAndroid Build Coastguard Worker inline bool IsVMInitialized() {
68*6777b538SAndroid Build Coastguard Worker   return jni_zero::IsVMInitialized();
69*6777b538SAndroid Build Coastguard Worker }
70*6777b538SAndroid Build Coastguard Worker 
71*6777b538SAndroid Build Coastguard Worker // Returns the global JVM, or nullptr if it has not been initialized.
GetVM()72*6777b538SAndroid Build Coastguard Worker inline JavaVM* GetVM() {
73*6777b538SAndroid Build Coastguard Worker   return jni_zero::GetVM();
74*6777b538SAndroid Build Coastguard Worker }
75*6777b538SAndroid Build Coastguard Worker 
76*6777b538SAndroid Build Coastguard Worker // Do not allow any future native->java calls.
77*6777b538SAndroid Build Coastguard Worker // This is necessary in gtest DEATH_TESTS to prevent
78*6777b538SAndroid Build Coastguard Worker // GetJavaStackTraceIfPresent() from accessing a defunct JVM (due to fork()).
79*6777b538SAndroid Build Coastguard Worker // https://crbug.com/1484834
DisableJvmForTesting()80*6777b538SAndroid Build Coastguard Worker inline void DisableJvmForTesting() {
81*6777b538SAndroid Build Coastguard Worker   return jni_zero::DisableJvmForTesting();
82*6777b538SAndroid Build Coastguard Worker }
83*6777b538SAndroid Build Coastguard Worker 
84*6777b538SAndroid Build Coastguard Worker // Finds the class named |class_name| and returns it.
85*6777b538SAndroid Build Coastguard Worker // Use this method instead of invoking directly the JNI FindClass method (to
86*6777b538SAndroid Build Coastguard Worker // prevent leaking local references).
87*6777b538SAndroid Build Coastguard Worker // This method triggers a fatal assertion if the class could not be found.
88*6777b538SAndroid Build Coastguard Worker // Use HasClass if you need to check whether the class exists.
GetClass(JNIEnv * env,const char * class_name)89*6777b538SAndroid Build Coastguard Worker inline ScopedJavaLocalRef<jclass> GetClass(JNIEnv* env,
90*6777b538SAndroid Build Coastguard Worker                                            const char* class_name) {
91*6777b538SAndroid Build Coastguard Worker   return jni_zero::GetClass(env, class_name);
92*6777b538SAndroid Build Coastguard Worker }
93*6777b538SAndroid Build Coastguard Worker 
94*6777b538SAndroid Build Coastguard Worker 
95*6777b538SAndroid Build Coastguard Worker // Returns true if an exception is pending in the provided JNIEnv*.
HasException(JNIEnv * env)96*6777b538SAndroid Build Coastguard Worker inline bool HasException(JNIEnv* env) {
97*6777b538SAndroid Build Coastguard Worker   return jni_zero::HasException(env);
98*6777b538SAndroid Build Coastguard Worker }
99*6777b538SAndroid Build Coastguard Worker 
100*6777b538SAndroid Build Coastguard Worker // If an exception is pending in the provided JNIEnv*, this function clears it
101*6777b538SAndroid Build Coastguard Worker // and returns true.
ClearException(JNIEnv * env)102*6777b538SAndroid Build Coastguard Worker inline bool ClearException(JNIEnv* env) {
103*6777b538SAndroid Build Coastguard Worker   return jni_zero::ClearException(env);
104*6777b538SAndroid Build Coastguard Worker }
105*6777b538SAndroid Build Coastguard Worker 
106*6777b538SAndroid Build Coastguard Worker // This function will call CHECK() macro if there's any pending exception.
107*6777b538SAndroid Build Coastguard Worker BASE_EXPORT void CheckException(JNIEnv* env);
108*6777b538SAndroid Build Coastguard Worker 
109*6777b538SAndroid Build Coastguard Worker // This returns a string representation of the java stack trace.
110*6777b538SAndroid Build Coastguard Worker BASE_EXPORT std::string GetJavaExceptionInfo(
111*6777b538SAndroid Build Coastguard Worker     JNIEnv* env,
112*6777b538SAndroid Build Coastguard Worker     const JavaRef<jthrowable>& throwable);
113*6777b538SAndroid Build Coastguard Worker // This returns a string representation of the java stack trace.
114*6777b538SAndroid Build Coastguard Worker BASE_EXPORT std::string GetJavaStackTraceIfPresent();
115*6777b538SAndroid Build Coastguard Worker 
116*6777b538SAndroid Build Coastguard Worker using MethodID = jni_zero::MethodID;
117*6777b538SAndroid Build Coastguard Worker }  // namespace android
118*6777b538SAndroid Build Coastguard Worker }  // namespace base
119*6777b538SAndroid Build Coastguard Worker 
120*6777b538SAndroid Build Coastguard Worker #endif  // BASE_ANDROID_JNI_ANDROID_H_
121