1 /* 2 * Copyright (C) 2013 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 #ifndef JNI_INVOCATION_H_included 18 #define JNI_INVOCATION_H_included 19 20 #include <jni.h> 21 22 // JniInvocation adds a layer of indirection for applications using 23 // the JNI invocation API to allow the JNI implementation to be 24 // selected dynamically. Apps can specify a specific implementation to 25 // be used by calling InitJniInvocation. If this is not done, the 26 // library will chosen based on the value of Android system property 27 // persist.sys.dalvik.vm.lib on the device, and otherwise fall back to 28 // a hard-coded default implementation. 29 class JniInvocation { 30 public: 31 JniInvocation(); 32 33 ~JniInvocation(); 34 35 // Initialize JNI invocation API. library should specifiy a valid 36 // shared library for opening via dlopen providing a JNI invocation 37 // implementation, or null to allow defaulting via 38 // persist.sys.dalvik.vm.lib. 39 bool Init(const char* library); 40 41 private: 42 43 bool FindSymbol(void** pointer, const char* symbol); 44 45 static JniInvocation& GetJniInvocation(); 46 47 jint JNI_GetDefaultJavaVMInitArgs(void* vmargs); 48 jint JNI_CreateJavaVM(JavaVM** p_vm, JNIEnv** p_env, void* vm_args); 49 jint JNI_GetCreatedJavaVMs(JavaVM** vms, jsize size, jsize* vm_count); 50 51 static JniInvocation* jni_invocation_; 52 53 void* handle_; 54 jint (*JNI_GetDefaultJavaVMInitArgs_)(void*); 55 jint (*JNI_CreateJavaVM_)(JavaVM**, JNIEnv**, void*); 56 jint (*JNI_GetCreatedJavaVMs_)(JavaVM**, jsize, jsize*); 57 58 friend jint JNI_GetDefaultJavaVMInitArgs(void* vm_args); 59 friend jint JNI_CreateJavaVM(JavaVM** p_vm, JNIEnv** p_env, void* vm_args); 60 friend jint JNI_GetCreatedJavaVMs(JavaVM** vms, jsize size, jsize* vm_count); 61 }; 62 63 #endif // JNI_INVOCATION_H_included 64