How native function is called in…
2014-01-15 12:04
351 查看
How native function is called in Android platform ( unfinished
version)
1. Power.java
--> find corresponding native c
file
android.os.Power.java -------- native file ---->
.../jni/android_os_Power.c
2. in android_os_Power.c, you can
find:
static JNINativeMethod method_table[]
= // Native function
table
{
{
"acquireWakeLock", "(ILjava/lang/String;)V", (void*)acquireWakeLock
},
{
"releaseWakeLock", "(Ljava/lang/String;)V", (void*)releaseWakeLock
},
{
"setLastUserActivityTimeout", "(J)I",
(void*)setLastUserActivityTimeout },
{
"setScreenState", "(Z)I", (void*)setScreenState },
{
"shutdown", "()V", (void*)android_os_Power_shutdown },
{ "reboot",
"(Ljava/lang/String;)V", (void*)android_os_Power_reboot },
};
int register_android_os_Power(JNIEnv *env)
// function to register mapping table
from name to function
{
return
AndroidRuntime::registerNativeMethods(
env, "android/os/Power",
method_table, NELEM(method_table));
}
3. in /framework/base/core/jni , a file named:
AndroidRuntime.cpp
3.1) a global register function array
static const RegJNIRec gRegJNI[] =
{
...
register_android_os_Power,
}
3.2) Register native function process
int AndroidRuntime::startReg(JNIEnv* env)
or
Java_com_android_internal_util_WithFramework_registerNatives(...)
or
Java_LoadClass_registerNatives(....)
---> register_jni_procs(gRegJNI, NELEM(gRegJNI),
env)
---> foreach(member of gRegJNI)
call register_XXX_XXX_XXX..XXX() //
so here register_android_os_power() will be
called
---> AndroidRuntime::registerNativeMethods(env, class_name
like "android/os/Power", method table like method_table,
size)
---> jniRegisterNativeMethods(env, className,
gMethods, numMethods)
-->
pEnv->RegisterNatives(env, clazz, gMethods,
numMethods) ;
--> foreach(method) call
dvmRegisterJNIMethod(ClassObject* clazz, const char*
methodName,
const
char* signature, void* fnPtr)
--> call
dvmSetNativeFunc(method, dvmCallSynchronizedJNIMethod, fnPtr); //
for sycn method
or
call
dvmSetNativeFunc(method, dvmCallJNIMethod,
fnPtr);
-->
((Method*)method)->insns = insns; // set actual code
space to be executed for a native function
4.
calling a native method ( JNI method)
void dvmPlatformInvoke(void* pEnv,
ClassObject* clazz, int argInfo, int argc,
const u4*
argv, const char* shorty, void* func, JValue*
pReturn)
dvmCallMethod() /dvmInvokeMethod
--->
if
(dvmIsNativeMethod(method))
{
(*method->nativeFunc)(self->curFrame,
&retval, method, self);
}
version)
1. Power.java
--> find corresponding native c
file
android.os.Power.java -------- native file ---->
.../jni/android_os_Power.c
2. in android_os_Power.c, you can
find:
static JNINativeMethod method_table[]
= // Native function
table
{
{
"acquireWakeLock", "(ILjava/lang/String;)V", (void*)acquireWakeLock
},
{
"releaseWakeLock", "(Ljava/lang/String;)V", (void*)releaseWakeLock
},
{
"setLastUserActivityTimeout", "(J)I",
(void*)setLastUserActivityTimeout },
{
"setScreenState", "(Z)I", (void*)setScreenState },
{
"shutdown", "()V", (void*)android_os_Power_shutdown },
{ "reboot",
"(Ljava/lang/String;)V", (void*)android_os_Power_reboot },
};
int register_android_os_Power(JNIEnv *env)
// function to register mapping table
from name to function
{
return
AndroidRuntime::registerNativeMethods(
env, "android/os/Power",
method_table, NELEM(method_table));
}
3. in /framework/base/core/jni , a file named:
AndroidRuntime.cpp
3.1) a global register function array
static const RegJNIRec gRegJNI[] =
{
...
register_android_os_Power,
}
3.2) Register native function process
int AndroidRuntime::startReg(JNIEnv* env)
or
Java_com_android_internal_util_WithFramework_registerNatives(...)
or
Java_LoadClass_registerNatives(....)
---> register_jni_procs(gRegJNI, NELEM(gRegJNI),
env)
---> foreach(member of gRegJNI)
call register_XXX_XXX_XXX..XXX() //
so here register_android_os_power() will be
called
---> AndroidRuntime::registerNativeMethods(env, class_name
like "android/os/Power", method table like method_table,
size)
---> jniRegisterNativeMethods(env, className,
gMethods, numMethods)
-->
pEnv->RegisterNatives(env, clazz, gMethods,
numMethods) ;
--> foreach(method) call
dvmRegisterJNIMethod(ClassObject* clazz, const char*
methodName,
const
char* signature, void* fnPtr)
--> call
dvmSetNativeFunc(method, dvmCallSynchronizedJNIMethod, fnPtr); //
for sycn method
or
call
dvmSetNativeFunc(method, dvmCallJNIMethod,
fnPtr);
-->
((Method*)method)->insns = insns; // set actual code
space to be executed for a native function
4.
calling a native method ( JNI method)
void dvmPlatformInvoke(void* pEnv,
ClassObject* clazz, int argInfo, int argc,
const u4*
argv, const char* shorty, void* func, JValue*
pReturn)
dvmCallMethod() /dvmInvokeMethod
--->
if
(dvmIsNativeMethod(method))
{
(*method->nativeFunc)(self->curFrame,
&retval, method, self);
}
相关文章推荐
- Implicit delcaration of function 'sysctlbyname'is invalid in c99 问题及解决办法
- Implicit declaration of function 'NSFileTypeForHFSTypeCode' is invalid in C99
- How to troubleshoot 'Procedure or function has too many arguments specified' in asp.net 2.0
- C++: How is the process of function calling in C++
- How to remove native support from an Android Project in eclipse because eclipse is showing errors in
- 即时通讯(环信)-bug Implicit declaration of function 'NSEaseLocalizedString' is invalid in C99
- C++: How is the process of function calling in C++
- How to write/use DLL in Linux sy…
- Implicit Declaration of function 'glBindVertexArrayOES' is invalid in c99
- [C/CPP系列知识] 在C中使用没有声明的函数时将发生什么 What happens when a function is called before its declaration in C
- rapidxml 在mac下的编译error: call to function 'print_pi_node' that is neither visible in the template def
- C++: How is the process of function calling in C++
- C++: How is the process of function calling in C++
- How to use virtual path providers to dynamically load and compile content from virtual paths in
- What is the function MultiplyUV() in shader?
- Can't update table 'tbl' in stored function/trigger because it is already used by statement which invoked this stored function/t
- C++: How is the process of function calling in C++
- How to create patch file in Linu…
- Google+ is Blocked in China
- How to check ip address in linux