您的位置:首页 > 其它

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);



}



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐