Android 中Native方法是怎样调用的
2010-12-25 12:33
441 查看
1. Power.java--> find corresponding native cfile(查找对应的具体用C实现的C文件)
android.os.Power.java -------- native file ---->.../jni/android_os_Power.c2. 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)
dvmCallMethod() /dvmInvokeMethod
---> if(dvmIsNativeMethod(method))
{
(*method->nativeFunc)(self->curFrame,&retval, method, self);
}
相关文章推荐
- Android 中Native方法是怎样调用的
- Android 中Native方法是怎样调用的
- (八)React Native实现调用android原生java方法并实现广播的发送和接受
- Android关于JavaScript与Native方法相互调用
- Android Studio Jni开发(二)实现Native调用java方法和Native调用Android API
- React Native:JS调用Android本地方法
- react-native调用Android的原生方法
- React-Native:调用(Android)Native方法
- 【学习Android NDK开发】Java通过JNI调用native方法
- Android中WebView通过JavaScript调用Native方法
- Android JNI开发(2)--native方法调用Java方法
- Android之JNI实例一--简单的Java调用Native方法
- Android 中最简单的实现 HTML(H5)调用native原生页面的方法
- JS怎样调用Android本地原生方法
- Android中webview js与native方法互相调用
- Android Studio加载so库和调用native方法
- Android开发-Fragment中调用父Activity中方法-AndroidStudio
- android语音识别方法二:应用程序自己调用语音识别库
- 如何在Android平台上使用JS直接调用Java方法
- 【转载】Android之webkit内核JNI层与Java层 函数互相调用方法