• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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.
42   static const char* GetLibrary(const char* library);
43 
44  private:
45 
46   bool FindSymbol(void** pointer, const char* symbol);
47 
48   static JniInvocation& GetJniInvocation();
49 
50   jint JNI_GetDefaultJavaVMInitArgs(void* vmargs);
51   jint JNI_CreateJavaVM(JavaVM** p_vm, JNIEnv** p_env, void* vm_args);
52   jint JNI_GetCreatedJavaVMs(JavaVM** vms, jsize size, jsize* vm_count);
53 
54   static JniInvocation* jni_invocation_;
55 
56   void* handle_;
57   jint (*JNI_GetDefaultJavaVMInitArgs_)(void*);
58   jint (*JNI_CreateJavaVM_)(JavaVM**, JNIEnv**, void*);
59   jint (*JNI_GetCreatedJavaVMs_)(JavaVM**, jsize, jsize*);
60 
61   friend jint JNI_GetDefaultJavaVMInitArgs(void* vm_args);
62   friend jint JNI_CreateJavaVM(JavaVM** p_vm, JNIEnv** p_env, void* vm_args);
63   friend jint JNI_GetCreatedJavaVMs(JavaVM** vms, jsize size, jsize* vm_count);
64 };
65 
66 #endif  // JNI_INVOCATION_H_included
67