Android 中Native方法是怎样调用的
来源:互联网 发布:会员积分软件dnnyun 编辑:程序博客网 时间:2024/05/16 16:24
1. Power.java--> find corresponding native cfile(查找对应的具体用C实现的C文件)
android.os.Power.java -------- native file ---->.../jni/android_os_Power.c
2. in android_os_Power.c, you canfind:
static JNINativeMethod method_table[]= // Native functiontable{
{"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 tablefrom name to function
{
returnAndroidRuntime::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 becalled
---> AndroidRuntime::registerNativeMethods(env, class_namelike "android/os/Power", method table like method_table,size)
---> jniRegisterNativeMethods(env, className,gMethods, numMethods)
-->pEnv->RegisterNatives(env, clazz, gMethods,numMethods) ;
--> foreach(method) calldvmRegisterJNIMethod(ClassObject* clazz, const char*methodName,
constchar* signature, void* fnPtr)
--> calldvmSetNativeFunc(method, dvmCallSynchronizedJNIMethod, fnPtr); //for sycn method
or
call dvmSetNativeFunc(method, dvmCallJNIMethod,fnPtr);
--> ((Method*)method)->insns = insns; // set actual codespace 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)
const u4*argv, const char* shorty, void* func, JValue*pReturn)
dvmCallMethod() /dvmInvokeMethod
---> if(dvmIsNativeMethod(method))
{
(*method->nativeFunc)(self->curFrame,&retval, method, self);
}
(*method->nativeFunc)(self->curFrame,&retval, method, self);
}
0 0
- Android 中Native方法是怎样调用的
- Android 中Native方法是怎样调用的
- Android 中Native方法是怎样调用的
- Android是怎样调用硬件加速的
- react-native调用Android的原生方法
- wp7中调用native代码的方法
- Android中framework层的cpp文件中调用native层c函数的方法
- React-Native:调用(Android)Native方法
- RCP中的ApplicationActionBarAdvisor类是怎样调用fillCoolBar方法的!
- Android 中最简单的实现 HTML(H5)调用native原生页面的方法
- JAVA中native方法调用
- JAVA中native方法调用
- Android中webview js与native方法互相调用
- Android中WebView通过JavaScript调用Native方法
- [Android中react-native调用Native]
- 在java中调用c程序--native方法的学习
- native应用 在C中调用JAVA的方法
- method方法在class文件中是怎样组织的
- 欢迎使用CSDN-markdown编辑器
- apache+nginx 实现动静分离
- linux 路由表 的一些相关资料
- 用友ERP-供应链2-基础信息
- POJ1833:排列
- Android 中Native方法是怎样调用的
- 第一篇Blog……
- 假如你想成为全栈工程师…
- 加班到底有什么用
- 论加班
- Swift之便利构造函数
- 通过BroadcastReceiver和 service 实现开机自动启动
- bindService 实现音乐播放的功能
- Android Scroll分析--实现滑动的七种方法