如何添加一个Application Framework Service(with native code)?
前面介绍了如何添加一个不包含native code的Application Framework Service,
下面介绍如何添加包含native的Application Framework Service,仍然以
HelloWorldService为例,具体的步骤如下:
1、前面的几个修改步骤与添加一个不包含native code的Application Framework Service的基本相同,
除了需要将路径frameworks/base/services/java/com/android/server/下的
HelloWorldService.java文件中的函数:
public void printHelloWorld()
public void printString(String string)
中的功能都修改为由native函数去完成,
修改后的文件:
HelloWorldService.java
package com.android.server;
import android.app.IHelloWorld;
import android.content.Context;
Import android.os.RemoteException;
public class HelloWorldService extends IHelloWorld.Stub
{
private static final String TAG = "HelloWorldService";
private Context mContext = null;
public HelloWorldService(Context context)
{
mContext = context;
}
@Override
public void printHelloWorld() throws RemoteException
{
// TODO Auto-generated method stub
printHelloWorldJNI();
}
@Override
public void printString(String string) throws RemoteException
{
// TODO Auto-generated method stub
printStringJNI(string);
}
private native void printHelloWorldJNI();
private native void printStringJNI(String string);
}
2、在路径frameworks/base/services/jni/下添加文件:
com_android_server_HelloWorldService.cpp:
#include "JNIHelp.h"
#include "jni.h"
#include "cutils/log.h"
namespace android
{
/*
* Class: com_android_server_HelloWorldService
* Method: printHelloWorldJNI
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_com_android_server_HelloWorldService_printHelloWorldJNI
(JNIEnv *env, jobject thiz)
{
LOGD("Hello World from native code!\n");
}
/*
* Class: com_android_server_HelloWorldService
* Method: printStringJNI
* Signature: (Ljava/lang/String;)V
*/
JNIEXPORT void JNICALL Java_com_android_server_HelloWorldService_printStringJNI
(JNIEnv *env , jobject thiz, jstring str)
{
const char* pstr;
pstr = env->GetStringUTFChars(str, NULL);
if(pstr == NULL)
{
return;
}
LOGD("str is: %s\n", pstr);
env->ReleaseStringUTFChars(str, pstr);
}
static JNINativeMethod sMethods[] =
{
{"printHelloWorldJNI", "()V",
(void*)Java_com_android_server_HelloWorldService_printHelloWorldJNI},
{"printStringJNI", "(Ljava/lang/String;)V",
(void*)Java_com_android_server_HelloWorldService_printStringJNI},
};
int register_android_server_HelloWorldService(JNIEnv* env)
{
return jniRegisterNativeMethods(env, "com/android/server/HelloWorldService",
sMethods, NELEM(sMethods));
}
}; //namespace android
需要注意:
(1)文件的命名方式(后续需要测试一下其它的命名方式是否可以);
(2)文件中的代码需要namespace android的命名空间声明;
(3)文件中的GetStringUTFChars等nativehelper/jni.h文件中的函数
调用区分C和C++两种情况下处理:
C情况下处理:
(*env)->GetStringUTFChars(env, str, NULL);
C++情况下处理:
env->GetStringUTFChars(str, NULL);
(4)文件com_android_server_HelloWorldService.cpp的最后,在
static JNINativeMethod sMethods[]中建立Java代码中native
函数和C++中函数的映射关系,并且通过最后的
register_android_server_HelloWorldService函数注册这个映射
关系;
3、修改路径frameworks/base/services/jni/下的文件:
onload.cpp:
参照AlarmManagerService:
int register_android_server_AlarmManagerService(JNIEnv* env);
register_android_server_AlarmManagerService(env);
添加HelloWorldService:
int register_android_server_HelloWorldService(JNIEnv* env);
register_android_server_HelloWorldService(env);
4、修改路径frameworks/base/services/jni/下的文件:
Android.mk:
在“LOCAL_SRC_FILES:= \”中,参照AlarmManagerService:
com_android_server_AlarmManagerService.cpp \
添加HelloWorldService:
com_android_server_HelloWorldService.cpp \
5、使用之前的HelloWorldServiceTest程序测试,测试结果如下: