背景
为framework添加一个新的模块 可以通过framework层调用native层,并为第三方提供调用方式
实现
1. framework部分
1). 在framework/base 下新添加一个文件夹demo
新建java/com/test/DemoManager.java
package com.test;
public class DemoManager {
public static native void sayHelloNative();
static{
System.loadLibrary("demojni");
}
}
DemoManager 为应用层提供相关API,如 sayHelloNative(),这里是直接调用了JNI的native方法。值得注意的是DemoManager加载了中的System.loadLibrary(“demojni”)加载了下一步生成的libdemojni.so文件。
2). 修改build/core/pathmap.mk
#
# A list of all source roots under frameworks/base, which will be
# built into the android.jar.
#
FRAMEWORKS_BASE_SUBDIRS := \
$(addsuffix /java, \
core \
graphics \
location \
media \
media/mca/effect \
media/mca/filterfw \
media/mca/filterpacks \
drm \
opengl \
sax \
telecomm \
telephony \
wifi \
keystore \
rs \
+++ demo \
)
3). 根据项目实际情况添加以下内容到系统
PRODUCT_PACKAGES += libdemojni
2. JNI部分
1). 新建 jni/com_test_DemoManager.c
#include <stdio.h>
#include <stdlib.h>
#include <jni.h>
#include <android/log.h>
#define TAG "demonative"
#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG,TAG,__VA_ARGS__)
jobject
Java_com_test_DemoManager_sayHelloNative( JNIEnv* env,jobject thiz,jstring alg)
{
LOGD("DemoManager_sayHelloNative");
return (*env)->CallStaticObjectMethod(env, cls, tmfCb,alg);
}
}
2).新建 jni/Android.mk
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_SRC_FILES := com_test_DemoManager.c
LOCAL_MODULE := libdemojni
LOCAL_LDLIBS := -lm -llog
LOCAL_SHARED_LIBRARIES := liblog libcutils
include $(BUILD_SHARED_LIBRARY)
3. 应用层调用API
1). 将第一步的DemoManager.java生成一个jar包或者aar包供应用层调用
2). 应用层项目加载jar/aar
3). 使用
package com.android.demoooo;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
DemoManager.sayHelloNative();
}
}
参考出处 https://blog.csdn.net/liwendovo/article/details/8010616