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 // Exposes which library is actually loaded from the given name. The 42 // buffer of size PROPERTY_VALUE_MAX will be used to load the system 43 // property for the default library, if necessary. If no buffer is 44 // provided, the fallback value will be used. 45 static const char* GetLibrary(const char* library, char* buffer); 46 47 private: 48 49 bool FindSymbol(void** pointer, const char* symbol); 50 51 static JniInvocation& GetJniInvocation(); 52 53 jint JNI_GetDefaultJavaVMInitArgs(void* vmargs); 54 jint JNI_CreateJavaVM(JavaVM** p_vm, JNIEnv** p_env, void* vm_args); 55 jint JNI_GetCreatedJavaVMs(JavaVM** vms, jsize size, jsize* vm_count); 56 57 static JniInvocation* jni_invocation_; 58 59 void* handle_; 60 jint (*JNI_GetDefaultJavaVMInitArgs_)(void*); 61 jint (*JNI_CreateJavaVM_)(JavaVM**, JNIEnv**, void*); 62 jint (*JNI_GetCreatedJavaVMs_)(JavaVM**, jsize, jsize*); 63 64 friend jint JNI_GetDefaultJavaVMInitArgs(void* vm_args); 65 friend jint JNI_CreateJavaVM(JavaVM** p_vm, JNIEnv** p_env, void* vm_args); 66 friend jint JNI_GetCreatedJavaVMs(JavaVM** vms, jsize size, jsize* vm_count); 67 }; 68 69 #endif // JNI_INVOCATION_H_included 70