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

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

相关推荐

  1. 如何Android Framework增加jni方法

    2023-12-22 15:18:04       49 阅读
  2. FFmpeg增加自定义程序

    2023-12-22 15:18:04       46 阅读
  3. Android jni开发崩溃分析定位行号

    2023-12-22 15:18:04       44 阅读
  4. 如何本地搭建OpenHarmony仓库

    2023-12-22 15:18:04       31 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2023-12-22 15:18:04       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2023-12-22 15:18:04       106 阅读
  3. 在Django里面运行非项目文件

    2023-12-22 15:18:04       87 阅读
  4. Python语言-面向对象

    2023-12-22 15:18:04       96 阅读

热门阅读

  1. 音频筑基:基音、基频和共振峰

    2023-12-22 15:18:04       90 阅读
  2. Http---URL

    2023-12-22 15:18:04       69 阅读
  3. Vue3+Ts+Vite2+Pinia 搭建开发框架

    2023-12-22 15:18:04       47 阅读
  4. MySQL数据库利用binlog日志文件恢复数据

    2023-12-22 15:18:04       62 阅读
  5. 算法-两数相加

    2023-12-22 15:18:04       62 阅读
  6. Ubuntu环境下SomeIP/CommonAPI环境搭建详细步骤

    2023-12-22 15:18:04       72 阅读
  7. ubuntu打开USB摄像头的工具

    2023-12-22 15:18:04       58 阅读
  8. 7. ASP.NET Core Blazor 官网文档

    2023-12-22 15:18:04       61 阅读