1、创建一个文件夹jni_test(自定义)
存放位置:frameworks\base\jni_test
2、在jni_test目录下创建java目录和jni目录
jin目录下放入
*.cpp或*.c文件
#include <jni.h>
#include <string>
extern "C" {
JNIEXPORT jint JNICALL
Java_com_test_tai_NATEST_add(JNIEnv *env, jobject thiz, jint a, jint b) {
//这里方法名,一定要和jave目录下的NATEST类的包名 类名 方法名一一对应
// java/com/test/tai/NATEST.java 类中add方法
return a + b;
}
JNIEXPORT jstring JNICALL
Java_com_test_tai_NATEST_stringFromJNI
(JNIEnv *env, jobject thiz) {
//这里方法名,一定要和jave目录下的NATEST类的包名 类名 方法名一一对应
// java/com/test/tai/NATEST.java 类中stringFromJNI方法
const char *s = "hell_world";
return env->NewStringUTF(s);}
}
以及相关Android.mk
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_SRC_FILES := add_test.cpp \ (c文件名称)
LOCAL_MODULE := libhello_test(lib+jni文件名称)
LOCAL_CFLAGS += -Wno-unused-parameter
LOCAL_LDLIBS := -llog
include $(BUILD_SHARED_LIBRARY)
3、在java/com/test/tai/目录下添加自定义的NATEST.java,作为提供给上层的调用接口。
NATEST代码如下:
package com.test.tai;
public class NATEST {
static {
System.loadLibrary("hello_test");
}
/**
* A native method that is implemented by the 'native-lib' native library,
* which is packaged with this application.
*/
public static native String stringFromJNI();
public static native int add(int a, int b);
}
添加源码完成后就可以执行模块编译,编译结果是一个hello_test.so的库,这个库会在system/lib生成。
4、源码添加完成之后就是将jni加入Android客服端中,能够作为接口提供给每一个上层应用。
首先在/build/core/pathmap.mk中FRAMEWORKS_BASE_SUBDIRS中停驾 自定义的文件夹名:
FRAMEWORKS_BASE_SUBDIRS := \
$(addsuffix /java, \
...省略
jni_test \
...省略
)
然后在/device/product/common或者device\rockchip\common目录下 device.mk中添加自定义的MODULE
PRODUCT_PACKAGES += \
+ libhello_test \
5.在frameworks\base\目录下Android.bp或者Android.mk文件中添加:
java_defaults {
name: "framework-defaults",
installable: true,
srcs: [
。。。
"jni_control/java/**/*.java",
"jin_test/java/**/*.java"
添加完成后,进行整体编译即可。
备注:如果是8.1或者9.0版本就需要添加白名单:
添加白名单
按照 build/make/core/tasks/check_boot_jars/package_whitelist.txt 文件中其他包名格式,将自己的包名添加进去
com\.test\..*
出现报错error: unused parameter 'env' [-Werror,-Wunused-parameter]
解决办法:在Android.mk 文件中添加相应的flag,可以屏蔽掉error
LOCAL_CFLAGS += -Wno-unused-parameter