xref: /aosp_15_r20/libnativehelper/tests_mts/jni/jni_helper_jni.cpp (revision 0797b24ee566c78eb48500180cb4bf71f81c8aab)
1*0797b24eSAndroid Build Coastguard Worker /*
2*0797b24eSAndroid Build Coastguard Worker  * Copyright (C) 2020 The Android Open Source Project
3*0797b24eSAndroid Build Coastguard Worker  *
4*0797b24eSAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*0797b24eSAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*0797b24eSAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*0797b24eSAndroid Build Coastguard Worker  *
8*0797b24eSAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*0797b24eSAndroid Build Coastguard Worker  *
10*0797b24eSAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*0797b24eSAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*0797b24eSAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*0797b24eSAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*0797b24eSAndroid Build Coastguard Worker  * limitations under the License.
15*0797b24eSAndroid Build Coastguard Worker  */
16*0797b24eSAndroid Build Coastguard Worker 
17*0797b24eSAndroid Build Coastguard Worker #include <iterator>
18*0797b24eSAndroid Build Coastguard Worker 
19*0797b24eSAndroid Build Coastguard Worker #include <dlfcn.h>
20*0797b24eSAndroid Build Coastguard Worker #include <jni.h>
21*0797b24eSAndroid Build Coastguard Worker 
22*0797b24eSAndroid Build Coastguard Worker #include <android/log.h>
23*0797b24eSAndroid Build Coastguard Worker #include <nativehelper/jni_macros.h>
24*0797b24eSAndroid Build Coastguard Worker #include <nativehelper/scoped_local_ref.h>
25*0797b24eSAndroid Build Coastguard Worker #include <nativehelper/scoped_string_chars.h>
26*0797b24eSAndroid Build Coastguard Worker #include <nativehelper/scoped_utf_chars.h>
27*0797b24eSAndroid Build Coastguard Worker #include <nativehelper/JNIPlatformHelp.h>
28*0797b24eSAndroid Build Coastguard Worker 
29*0797b24eSAndroid Build Coastguard Worker #include "libnativehelper_test.h"
30*0797b24eSAndroid Build Coastguard Worker 
31*0797b24eSAndroid Build Coastguard Worker namespace {
32*0797b24eSAndroid Build Coastguard Worker 
throwException(JNIEnv * env,jclass,jstring className,jstring message)33*0797b24eSAndroid Build Coastguard Worker static void throwException(JNIEnv* env, jclass /*clazz*/, jstring className, jstring message) {
34*0797b24eSAndroid Build Coastguard Worker     ScopedUtfChars c(env, className);
35*0797b24eSAndroid Build Coastguard Worker     ScopedUtfChars m(env, message);
36*0797b24eSAndroid Build Coastguard Worker     jniThrowException(env, c.c_str(), m.c_str());
37*0797b24eSAndroid Build Coastguard Worker }
38*0797b24eSAndroid Build Coastguard Worker 
throwExceptionWithIntFormat(JNIEnv * env,jclass,jstring className,jstring format,jint value)39*0797b24eSAndroid Build Coastguard Worker static void throwExceptionWithIntFormat(JNIEnv* env,
40*0797b24eSAndroid Build Coastguard Worker                                         jclass /*clazz*/,
41*0797b24eSAndroid Build Coastguard Worker                                         jstring className,
42*0797b24eSAndroid Build Coastguard Worker                                         jstring format,
43*0797b24eSAndroid Build Coastguard Worker                                         jint value) {
44*0797b24eSAndroid Build Coastguard Worker     ScopedUtfChars c(env, className);
45*0797b24eSAndroid Build Coastguard Worker     ScopedUtfChars f(env, format);
46*0797b24eSAndroid Build Coastguard Worker     jniThrowExceptionFmt(env, c.c_str(), f.c_str(), value);
47*0797b24eSAndroid Build Coastguard Worker }
48*0797b24eSAndroid Build Coastguard Worker 
throwNullPointerException(JNIEnv * env,jclass,jstring message)49*0797b24eSAndroid Build Coastguard Worker static void throwNullPointerException(JNIEnv* env,
50*0797b24eSAndroid Build Coastguard Worker                                       jclass /*clazz*/,
51*0797b24eSAndroid Build Coastguard Worker                                       jstring message) {
52*0797b24eSAndroid Build Coastguard Worker     ScopedUtfChars m(env, message);
53*0797b24eSAndroid Build Coastguard Worker     jniThrowNullPointerException(env, m.c_str());
54*0797b24eSAndroid Build Coastguard Worker }
55*0797b24eSAndroid Build Coastguard Worker 
throwRuntimeException(JNIEnv * env,jclass,jstring message)56*0797b24eSAndroid Build Coastguard Worker static void throwRuntimeException(JNIEnv* env, jclass /*clazz*/, jstring message) {
57*0797b24eSAndroid Build Coastguard Worker     ScopedUtfChars m(env, message);
58*0797b24eSAndroid Build Coastguard Worker     jniThrowRuntimeException(env, m.c_str());
59*0797b24eSAndroid Build Coastguard Worker }
60*0797b24eSAndroid Build Coastguard Worker 
throwIOException(JNIEnv * env,jclass,jint cause)61*0797b24eSAndroid Build Coastguard Worker static void throwIOException(JNIEnv* env, jclass /*clazz*/, jint cause) {
62*0797b24eSAndroid Build Coastguard Worker     jniThrowIOException(env, cause);
63*0797b24eSAndroid Build Coastguard Worker }
64*0797b24eSAndroid Build Coastguard Worker 
throwErrnoException(JNIEnv * env,jclass,jstring functionName,jint cause)65*0797b24eSAndroid Build Coastguard Worker static void throwErrnoException(JNIEnv* env, jclass /*clazz*/, jstring functionName, jint cause) {
66*0797b24eSAndroid Build Coastguard Worker     ScopedUtfChars m(env, functionName);
67*0797b24eSAndroid Build Coastguard Worker     jniThrowErrnoException(env, m.c_str(), cause);
68*0797b24eSAndroid Build Coastguard Worker }
69*0797b24eSAndroid Build Coastguard Worker 
logException(JNIEnv * env,jclass,jthrowable throwable)70*0797b24eSAndroid Build Coastguard Worker static void logException(JNIEnv* env, jclass /*clazz*/, jthrowable throwable) {
71*0797b24eSAndroid Build Coastguard Worker     jniLogException(env, ANDROID_LOG_VERBOSE, __FILE__, throwable);
72*0797b24eSAndroid Build Coastguard Worker }
73*0797b24eSAndroid Build Coastguard Worker 
fileDescriptorCreate(JNIEnv * env,jclass,jint unix_fd)74*0797b24eSAndroid Build Coastguard Worker static jobject fileDescriptorCreate(JNIEnv* env, jclass /*clazz*/, jint unix_fd) {
75*0797b24eSAndroid Build Coastguard Worker     return jniCreateFileDescriptor(env, unix_fd);
76*0797b24eSAndroid Build Coastguard Worker }
77*0797b24eSAndroid Build Coastguard Worker 
fileDescriptorGetFD(JNIEnv * env,jclass,jobject jiofd)78*0797b24eSAndroid Build Coastguard Worker static jint fileDescriptorGetFD(JNIEnv* env, jclass /*clazz*/, jobject jiofd) {
79*0797b24eSAndroid Build Coastguard Worker     return jniGetFDFromFileDescriptor(env, jiofd);
80*0797b24eSAndroid Build Coastguard Worker }
81*0797b24eSAndroid Build Coastguard Worker 
fileDescriptorSetFD(JNIEnv * env,jclass,jobject jiofd,jint unix_fd)82*0797b24eSAndroid Build Coastguard Worker static void fileDescriptorSetFD(JNIEnv* env, jclass /*clazz*/, jobject jiofd, jint unix_fd) {
83*0797b24eSAndroid Build Coastguard Worker     jniSetFileDescriptorOfFD(env, jiofd, unix_fd);
84*0797b24eSAndroid Build Coastguard Worker }
85*0797b24eSAndroid Build Coastguard Worker 
createString(JNIEnv * env,jclass,jstring value)86*0797b24eSAndroid Build Coastguard Worker static jstring createString(JNIEnv* env, jclass /*clazz*/, jstring value) {
87*0797b24eSAndroid Build Coastguard Worker     ScopedStringChars ssc(env, value);
88*0797b24eSAndroid Build Coastguard Worker     return jniCreateString(env, ssc.get(), ssc.size());
89*0797b24eSAndroid Build Coastguard Worker }
90*0797b24eSAndroid Build Coastguard Worker 
91*0797b24eSAndroid Build Coastguard Worker }  // namespace
92*0797b24eSAndroid Build Coastguard Worker 
JNI_OnLoad(JavaVM * vm,void * reserved)93*0797b24eSAndroid Build Coastguard Worker JNIEXPORT jint JNI_OnLoad(JavaVM* vm, void* reserved) {
94*0797b24eSAndroid Build Coastguard Worker     JNIEnv* env;
95*0797b24eSAndroid Build Coastguard Worker     if (vm->GetEnv(reinterpret_cast<void**>(&env), JNI_VERSION_1_6) != JNI_OK) {
96*0797b24eSAndroid Build Coastguard Worker         return JNI_ERR;
97*0797b24eSAndroid Build Coastguard Worker     }
98*0797b24eSAndroid Build Coastguard Worker 
99*0797b24eSAndroid Build Coastguard Worker     static const JNINativeMethod methods[] = {
100*0797b24eSAndroid Build Coastguard Worker         MAKE_JNI_NATIVE_METHOD("throwException",
101*0797b24eSAndroid Build Coastguard Worker                                "(Ljava/lang/String;Ljava/lang/String;)V",
102*0797b24eSAndroid Build Coastguard Worker                                throwException),
103*0797b24eSAndroid Build Coastguard Worker         MAKE_JNI_NATIVE_METHOD("throwExceptionWithIntFormat",
104*0797b24eSAndroid Build Coastguard Worker                                "(Ljava/lang/String;Ljava/lang/String;I)V",
105*0797b24eSAndroid Build Coastguard Worker                                throwExceptionWithIntFormat),
106*0797b24eSAndroid Build Coastguard Worker         MAKE_JNI_NATIVE_METHOD("throwNullPointerException",
107*0797b24eSAndroid Build Coastguard Worker                                "(Ljava/lang/String;)V",
108*0797b24eSAndroid Build Coastguard Worker                                throwNullPointerException),
109*0797b24eSAndroid Build Coastguard Worker         MAKE_JNI_NATIVE_METHOD("throwRuntimeException",
110*0797b24eSAndroid Build Coastguard Worker                                "(Ljava/lang/String;)V",
111*0797b24eSAndroid Build Coastguard Worker                                throwRuntimeException),
112*0797b24eSAndroid Build Coastguard Worker         MAKE_JNI_NATIVE_METHOD("throwIOException",
113*0797b24eSAndroid Build Coastguard Worker                                "(I)V",
114*0797b24eSAndroid Build Coastguard Worker                                throwIOException),
115*0797b24eSAndroid Build Coastguard Worker         MAKE_JNI_NATIVE_METHOD("throwErrnoException",
116*0797b24eSAndroid Build Coastguard Worker                                "(Ljava/lang/String;I)V",
117*0797b24eSAndroid Build Coastguard Worker                                throwErrnoException),
118*0797b24eSAndroid Build Coastguard Worker         MAKE_JNI_NATIVE_METHOD("logException",
119*0797b24eSAndroid Build Coastguard Worker                                "(Ljava/lang/Throwable;)V",
120*0797b24eSAndroid Build Coastguard Worker                                logException),
121*0797b24eSAndroid Build Coastguard Worker         MAKE_JNI_NATIVE_METHOD("fileDescriptorCreate",
122*0797b24eSAndroid Build Coastguard Worker                                "(I)Ljava/io/FileDescriptor;",
123*0797b24eSAndroid Build Coastguard Worker                                fileDescriptorCreate),
124*0797b24eSAndroid Build Coastguard Worker         MAKE_JNI_NATIVE_METHOD("fileDescriptorGetFD",
125*0797b24eSAndroid Build Coastguard Worker                                "(Ljava/io/FileDescriptor;)I",
126*0797b24eSAndroid Build Coastguard Worker                                fileDescriptorGetFD),
127*0797b24eSAndroid Build Coastguard Worker         MAKE_JNI_NATIVE_METHOD("fileDescriptorSetFD",
128*0797b24eSAndroid Build Coastguard Worker                                "(Ljava/io/FileDescriptor;I)V",
129*0797b24eSAndroid Build Coastguard Worker                                fileDescriptorSetFD),
130*0797b24eSAndroid Build Coastguard Worker         MAKE_JNI_NATIVE_METHOD("createString",
131*0797b24eSAndroid Build Coastguard Worker                                "(Ljava/lang/String;)Ljava/lang/String;",
132*0797b24eSAndroid Build Coastguard Worker                                createString),
133*0797b24eSAndroid Build Coastguard Worker     };
134*0797b24eSAndroid Build Coastguard Worker     int rc = jniRegisterNativeMethods(env,
135*0797b24eSAndroid Build Coastguard Worker                                       "com/android/art/libnativehelper/JniHelpTest",
136*0797b24eSAndroid Build Coastguard Worker                                       methods,
137*0797b24eSAndroid Build Coastguard Worker                                       std::size(methods));
138*0797b24eSAndroid Build Coastguard Worker     if (rc != JNI_OK) return rc;
139*0797b24eSAndroid Build Coastguard Worker 
140*0797b24eSAndroid Build Coastguard Worker     return JNI_VERSION_1_6;
141*0797b24eSAndroid Build Coastguard Worker }
142