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

猜你喜欢

转载自blog.csdn.net/yjz_0314/article/details/131891694
今日推荐