Android11.0Frameworks中添加jni并调用自己的动态库

Android11.0Frameworks中添加jni并调用自己的动态库

Frameworks中添加jni

  1. 添加Test.java文件 文件路径:
    frameworks/base/core/java/com/yjz/demo/Test.java

public class Test{
   private native int add(int a, int b);
   private native int sub(int a, int b);
}

  1. 添加com_yjz_demo_Test.cpp 文件路径:frameworks/base/core/jni/com_yjz_demo_Test.cpp

#include "core_jni_helpers.h"
#include "my_math.h"
#include <nativehelper/JNIHelp.h>
#include <utils/Log.h>

namespace android {

static jint com_yjz_demo_Test_add(JNIEnv *env, jobject thiz, jint a, jint b) {
   return my_add(a, b);
}

static jint com_yjz_demo_Test_sub(JNIEnv *env, jobject thiz, jint a, jint b) {
   return my_sub(a, b);
}

static const char* const kClassPathName = "com/yjz/demo/Test";//第一步新建的Test.java,这里把报名中的"."替换为"/"
static JNINativeMethod gMethods[] = { //Java方法和本地方法映射方法表
   // name,              signature,     funcPtr
   {"add", "(II)I", (void *)com_yjz_demo_Test_add},
   {"sub", "(II)I", (void *)com_yjz_demo_Test_sub},
};

int register_com_yjz_demo_Test(JNIEnv* env) {
   return RegisterMethodsOrDie(env, kClassPathName, gMethods, NELEM(gMethods));//注册JNI,建立Test.java中方法与Native方法的关联;
}

}  // namespace android

  1. AndroidRuntime中进行注册 文件路径: frameworks/base/core/jni/AndroidRuntime.cpp

//******省略代码******
extern int register_com_yjz_demo_Test(JNIEnv *env);

static const RegJNIRec gRegJNI[] = {
//******省略代码******
REG_JNI(register_com_yjz_demo_Test),
};

  1. 向Android.bp中添加编译源文件 文件路径: frameworks/base/core/jni/Android.cpp

target:{
   android:{
      src:[
        //******省略代码******
        "com_yjz_demo_Test.cpp",
      ],
      shared_libs: [
        //******省略代码******
        //添加自己的动态库
        "libmymath",
      ],
   },
},

添加动态库

在这里插入图片描述

  1. 创建test库 路径:vendor/yjz/test
  2. 添加my_math.h文件 文件路径: vendor/yjz/test/my_math.h

#ifndef ANDROID_MY_MATH_H
#define ANDROID_MY_MATH_H

int my_add(int a, int b);
int my_sub(int a, int b);

#endif //ANDROID_MY_MATH_H

  1. 添加my_math.cpp文件 文件路径: vendor/yjz/test/my_math.cpp

#include <cstdio>
#include "my_math.h"

int my_add(int a, int b)
{
   printf("Hello Android %d \n", 55); //添加函数调用
   return a + b;
}

int my_sub(int a, int b)
{
   printf("Hello Android %d \n", 66); //添加函数调用
   return a - b;
}

  1. 添加Android.bp 文件路径: vendor/yjz/test/Android.bp

cc_library_shared {
   name: "libmymath",

   srcs: [
         "my_math.cpp"
         ],

   export_include_dirs: ["."],

   cflags: [
           "-Wall",
           "-Wextra",
           "-Werror",
           "-Wno-unused-parameter",
   ],
}

添加权限

  1. 如果Test.java中有方法提供给上层app调用,需要在greylist文件中添加包名 文件路径:
    frameworks/base/config/hiddenapi-greylist-packages.txt
com.yjz.demo
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值