我们都知道,在Android Framework源码中,有很多这种类型的方法,方法前缀有"public static native",这种方法就是native方法,会调用到jni中去。
如:public static native long getNativeHeapSize();
那如何在Android Framework源码中新增一个jni方法呢?
目录
1. 创建对应的jni cpp文件
2. 添加jni cpp中的内容
3. 在onload添加注册方法
4. 在Android.bp中添加新添加的cpp文件
5. 编译以及验证
主要需要以下几个步骤,以android源码为例PhoneWindowManager.java, 增加两个jni方法
frameworks/base/services/core/java/com/android/server/policy/PhoneWindowManager.java
package com.android.server.policy;
import xxx;
......
public class PhoneWindowManager implements WindowManagerPolicy {
...
+ public static native func1();
+ public static native func2(int info1, int info2);
}
首先需要创建出其对应的jni cpp文件,在哪里创建呢?在以下目录中,如果一开始不知道,可以找下其他java文件中对应的jni方法在哪里,就能找到这里啦!
frameworks/base/services/core/jni
这个目录下放置的是service目录下的对应的jni文件
文件名怎么起呢?文件名就是包名路径+类名,可以看到上面黑色加粗的地方,PowerManagerService的包名是package com.android.server.policy,那么就好创建对应的jni文件了,创建的文件如下:
frameworks/base/services/core/jni/com_android_server_power_PowerManagerService.cpp
frameworks/base/services/core/jni/com_android_server_power_PowerManagerService.cpp
//设置log标签名
#define LOG_TAG "native_phoneWindowManager"
#include
#include
#include
#include
#includenamespace android
{//func1对应的C++方法
static void nativefunc1(JNIEnv* env, jobject thiz) {
ALOGD("nativefunc1");
}//func2对应的C++方法
static void nativefunc2(JNIEnv* env, jobject thiz, jint info1, jint info2) {
ALOGD("nativefunc2: info1 = %d, info2 = %d", info1, info2);
}//这个是一种Java 和 C 函数的映射表数组,并在其中描述了函数的参数和返回值
//func1 是java中的方法,nativefunc1是C++中的方法,中间的部分是入参和返回值
//()V代表无入参,返回值是void
//(II)V代表入参为两个int, 返回值是void
static const JNINativeMethod method_table[] = {
{ "func1", "()V", (void*)nativefunc1},
{ "func2", "(II)V", (void*)nativefunc2},
};//注册jni方法,这个会调用jniRegisterNativeMethods,并将方法映射表传入进去
//第一个入参为PhoneWindowManager的包名+类型
int register_android_server_policy_PhoneWindowManager(JNIEnv *env) {
return jniRegisterNativeMethods(env, "com/android/server/policy/PhoneWindowManager",
method_table, NELEM(method_table));
}};
frameworks/base/services/core/jni/onload.cpp
namespace android {
+ int register_android_server_policy_PhoneWindowManager(JNIEnv* env);
};
using namespace android;
extern "C" jint JNI_OnLoad(JavaVM* vm, void* /* reserved */)
{......
+ register_android_server_policy_PhoneWindowManager(env);
return JNI_VERSION_1_4;
}
cc_library_static {
name: "libservices.core"srcs: [
......
+ "com_android_server_policy_PhoneWindowManager.cpp",
],
cc_library_shared { name: "libandroid_servers", defaults: ["libservices.core-libs"], whole_static_libs: ["libservices.core"], }
source, lunch选择对应的模块后,执行单编命令
make libandroid_servers