如何添加一个Application Framework Service(二)(with native code)

如何添加一个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程序测试,测试结果如下:


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值