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