8种机械键盘轴体对比
本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选?
通常第三方支持为了保护自己的核心代码,会将其编译成so,通过动态链接库调用其功能,下面展示下Android系统服务调用第三方动态链接库的方法:
首先在ActivityManagerService.java中增加一个 native方法:
static native void setXXFgApp(String appName);
接着我们可以在com_android_server_lights_LightsService.cpp 增加该native方法的实现:
代码位置:frameworksbaseservicescorejnicom_android_server_lights_LightsService.cpp
..........
#include "XXSystemServerApi.h"
..........
{
..........
static const JNINativeMethod XX_method_table_am[] = {
{ "setXXFgApp", "(Ljava/lang/String;)V", (void*)setXXFgApp }
};
int register_android_server_XXFgApp(JNIEnv *env)
{
int XX_result = jniRegisterNativeMethods(env, "com/android/server/am/ActivityManagerService", XX_method_table_am, NELEM(XX_method_table_am));
return XX_result;
}
static void setXXFgApp(JNIEnv* env, jobject /* clazz */,jstring fgApp){
const char * XX_fgAppChar ;
XX_fgAppChar = env->GetStringUTFChars( fgApp,NULL ) ;
if( XX_fgAppChar != NULL) {
//ALOGI("XX hook setXXFgApp %s ",XX_fgAppChar);
onSetXXFgApp((char*)XX_fgAppChar);
}
env->ReleaseStringUTFChars(fgApp, XX_fgAppChar);
void XXSystemServerApi::onSetXXFgApp(char* appName)
{
if (pfn_setFGApp != NULL)
{
//调用XXSystemServerApi.h中的方法来实现,具体实现在下文XXSystemServerApi.cpp中
pfn_setFGApp(appName);
}
}
..........
}
接着我们需要将register_android_server_XXFgApp方法添加到onload.cpp,从而新增的方法能够编译并加载到系统中
代码位置:frameworksbaseservicescorejnionload.cpp:
namespace android {
.....
int register_android_server_XXFgApp(JNIEnv* env);
.....
}
extern "C" jint JNI_OnLoad(JavaVM* vm, void* /* reserved */)
{
..........
register_android_server_XXFgApp(env);
..........
}
frameworksbaseservicescorejniXXSystemServerApi.cpp 的构造函数中:
XXSystemServerApi(){
..........
//加载动态链接库,具体的核心实现源码在该xxxx.so中,实现核心代码的保密
m_hXXLib = dlopen("XXXXXXX.so", RTLD_NOW | RTLD_LOCAL);
if (NULL == m_hXXLib)
{
ALOGE("XXXXXXX not loaded");
return;
}
//从动态链接库中加载对应的实现方法并赋值给pfn_setFGApp,完成pfn_setFGApp的初始化
pfn_setFGApp = (PFN_setFgApp)(dlsym(m_hXXLib, "onSetXXFgApp"));
..........
}