如何在Android Framework源码中增加jni方法

发布时间:2023年12月21日

我们都知道,在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);

}

1. 创建对应的jni cpp文件

首先需要创建出其对应的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

2. 添加jni 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));
}

};

3.? 在onload添加注册方法

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;
}

4. 在Android.bp中添加新添加的cpp文件

cc_library_static {
? ? name: "libservices.core"

? ? srcs: [

......

+? ? ? ? "com_android_server_policy_PhoneWindowManager.cpp",

? ? ],

5. 编译以及验证

cc_library_shared {
? ? name: "libandroid_servers",
? ? defaults: ["libservices.core-libs"],
? ? whole_static_libs: ["libservices.core"],
}

source, lunch选择对应的模块后,执行单编命令

make libandroid_servers?

文章来源:https://blog.csdn.net/weixin_41028555/article/details/135133692
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。