我们都知道,在Android Framework源码中,有很多这种类型的方法,方法前缀有"public static native",这种方法就是native方法,会调用到jni中去。
如:public static native long getNativeHeapSize();
那如何在Android Framework源码中新增一个jni方法呢?
目录
主要需要以下几个步骤,以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 <jni.h>
#include <nativehelper/JNIHelp.h>
#include <log/log.h>
#include <utils/Log.h>
#include <android-base/strings.h>namespace 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?