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