1f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
2f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Copyright (C) 2008 The Android Open Source Project
3f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
4f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
5f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * you may not use this file except in compliance with the License.
6f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * You may obtain a copy of the License at
7f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
8f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
9f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
10f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
11f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
12f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * See the License for the specific language governing permissions and
14f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * limitations under the License.
15f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
16f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
17f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Dalvik's native call interface.
18f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
19f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * You should follow the JNI function naming conventions, but prefix with
20f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * "Dalvik_" instead of "Java_".
21f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
22375fb116bcb817b37509ab579dbd55cdbb765cbfCarl Shapiro#ifndef DALVIK_NATIVE_H_
23375fb116bcb817b37509ab579dbd55cdbb765cbfCarl Shapiro#define DALVIK_NATIVE_H_
24f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
25f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
26f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Method description; equivalent to a JNI struct.
27f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
28d862faa2ceae186da5518607505eb942d634ced9Carl Shapirostruct DalvikNativeMethod {
29f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    const char* name;
30f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    const char* signature;
31f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    DalvikNativeFunc  fnPtr;
32d862faa2ceae186da5518607505eb942d634ced9Carl Shapiro};
33f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
34f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
35f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * All methods for one class.  The last "methodInfo" has a NULL "name".
36f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
37d862faa2ceae186da5518607505eb942d634ced9Carl Shapirostruct DalvikNativeClass {
38f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    const char* classDescriptor;
39f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    const DalvikNativeMethod* methodInfo;
40f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    u4          classDescriptorHash;          /* initialized at runtime */
41d862faa2ceae186da5518607505eb942d634ced9Carl Shapiro};
42f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
43f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
44f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* init/shutdown */
45f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectbool dvmNativeStartup(void);
46f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectvoid dvmNativeShutdown(void);
47f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
48f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
49f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
50f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Convert argc/argv into a function call.  This is platform-specific.
51f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
52d862faa2ceae186da5518607505eb942d634ced9Carl Shapiroextern "C" void dvmPlatformInvoke(void* pEnv, ClassObject* clazz, int argInfo,
53d862faa2ceae186da5518607505eb942d634ced9Carl Shapiro    int argc, const u4* argv, const char* signature, void* func, JValue* pResult);
54f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
55f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
56f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Generate hints to speed native calls.  This is platform specific.
57f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
58f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectu4 dvmPlatformInvokeHints(const DexProto* proto);
59f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
60f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
61f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Convert a short library name ("jpeg") to a system-dependent name
62f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * ("libjpeg.so").  Returns a newly-allocated string.
63f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
64f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectchar* dvmCreateSystemLibraryName(char* libName);
65f584b4a56e1d5b98ddd914cf5d40b7616bfa1302Elliott Hughesbool dvmLoadNativeCode(const char* fileName, Object* classLoader,
66f584b4a56e1d5b98ddd914cf5d40b7616bfa1302Elliott Hughes        char** detail);
67f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
68f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
69f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
70f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Resolve a native method.  This uses the same prototype as a
71f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * DalvikBridgeFunc, because it takes the place of the actual function
72f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * until the first time that it's invoked.
73f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
74f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Causes the method's class to be initialized.
75f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
76f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Throws an exception and returns NULL on failure.
77f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
78f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectvoid dvmResolveNativeMethod(const u4* args, JValue* pResult,
79f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    const Method* method, struct Thread* self);
80f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
811e83b4d026199073c057edcb7836d06ae0716390Andy McFadden/*
821e83b4d026199073c057edcb7836d06ae0716390Andy McFadden * Unregister all JNI native methods associated with a class.
831e83b4d026199073c057edcb7836d06ae0716390Andy McFadden */
841e83b4d026199073c057edcb7836d06ae0716390Andy McFaddenvoid dvmUnregisterJNINativeMethods(ClassObject* clazz);
851e83b4d026199073c057edcb7836d06ae0716390Andy McFadden
86f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define GET_ARG_LONG(_args, _elem)          dvmGetArgLong(_args, _elem)
87f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
88f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
89f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Helpful function for accessing long integers in "u4* args".
90f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
91f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * We can't just return *(s8*)(&args[elem]), because that breaks if our
92f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * architecture requires 64-bit alignment of 64-bit values.
93f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
94f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Big/little endian shouldn't matter here -- ordering of words within a
95f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * long seems consistent across our supported platforms.
96f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
97f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectINLINE s8 dvmGetArgLong(const u4* args, int elem)
98f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{
99f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    s8 val;
10065596b606c6fd15a27e43f0061789e6badfea473Carl Shapiro    memcpy(&val, &args[elem], sizeof(val));
101f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    return val;
102f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project}
103f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
104375fb116bcb817b37509ab579dbd55cdbb765cbfCarl Shapiro#endif  // DALVIK_NATIVE_H_
105