如何在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. 编译以及验证

Service目录下的Jni libservices.core被编译到了libandroid_servers中:
cc_library_shared {
    name: "libandroid_servers",
    defaults: ["libservices.core-libs"],
    whole_static_libs: ["libservices.core"],
}

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

make libandroid_servers 

 

 

 

  • 28
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值