您好,登錄后才能下訂單哦!
這篇文章主要為大家展示了“framwork新加模塊有哪些”,內容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領大家一起研究并學習一下“framwork新加模塊有哪些”這篇文章吧。
主要是基于Android系統現在的Framework模塊上再添加一個獨立的模塊,目前只是很簡單的framework層調用native層(后期根據學習的進度,會將hal層補上,還有aidl, stub, 異步)。基本思路為:
為應用添加framework接口,即SDK APIframework調用native代碼,即jni部分jni部分實現最終功能 最終功能其實就是很簡單的log打印,目的只要是重新溫習一下framework開發的流程。之前都是在Android現有的機制上添加API,這次嘗試添加一個獨立的模塊,只是個人的一個想法,不清楚Android添加一個新的獨立模塊的標準做法是怎樣的,就當作學習吧。
為應用添加framework接口,即SDK API
在framework/base目錄新建pmps目錄,在pmps目錄創建\java\android\pmps\PmpsManager.java 文件,輸入代碼:
package android.pmps;
import android.util.Log;
public class PmpsManager
{
private static final String LOG_TAG = "PmpsManager";
static {
System.loadLibrary("pmps_jni");
}
public PmpsManager() {
Log.i(LOG_TAG, "PmpsManager constructor().");
}
public native static void sayHello();
}
PmpsManager 為應用層提供相關API,如 sayHello(),這里是直接調用了JNI的native方法。值得注意的是PmpsManager加載了中的System.loadLibrary("pmps_jni")加載了文章中第3步將會生成的libpmps_jni.so文件。
還有一個需要注意的細節,我們可以先看一下framework/base目錄下的Android.mk文件,其中有一段:
# FRAMEWORKS_BASE_SUBDIRS comes from build/core/pathmap.mk
LOCAL_SRC_FILES := $(call find-other-java-files,$(FRAMEWORKS_BASE_SUBDIRS))
我們再看看build/core/pathmap.mk,其中有一段
FRAMEWORKS_BASE_SUBDIRS := \
$(addsuffix /java, \
core \
graphics \
location \
media \
opengl \
sax \
telephony \
wifi \
*** \
keystore \
voip \
)
也就是說我們要在build/core/pathmap.mk文件中添加pmps目錄,添加后為:
FRAMEWORKS_BASE_SUBDIRS := \
$(addsuffix /java, \
core \
graphics \
location \
media \
opengl \
sax \
telephony \
wifi \
*** \
keystore \
voip \
pmps \
)
然后我們就可以通過 mmm 命令編譯這個新添加的模塊了。
mmm framework/base 編譯,生成文件為out/target/product/generic/system/framework/framework.jar
代碼編譯通過后,就可以做接下來的事情了。
2.framework調用native代碼,即jni部分
上一步中的 publicnative static void sayHello() 就可以由應用層調用了,當然我們可以在framework里面再封裝一下,以實現更加復雜的功能,例如:
//api
public int sayHelloFirst()
{
//省略的代碼...
return sayHello();
}
//declaration
public native static void sayHello();
3.jni部分實現功能
這一步通過編寫native代碼實現framework中的調用的功能,可以實現具體的功能或者調用hal層的相關驅動,完成硬件操作功能。
當前只是簡單地打印一下信息。
值得注意的要實現JNI_OnLoad函數,如果有需要的話,也可以重寫JNI_OnUnLoad函數。
/*//device/libs/android_runtime/android_media_MediaPlayer.cpp
**
** Copyright 2007,The Android Open Source Project
**
** Licensed under theApache License, Version 2.0 (the "License");
** you may not usethis file except in compliance with the License.
** You may obtain acopy of the License at
**
** http://www.apache.org/licenses/LICENSE-2.0
**
** Unless required byapplicable law or agreed to in writing, software
** distributed underthe License is distributed on an "AS IS" BASIS,
** WITHOUT WARRANTIESOR CONDITIONS OF ANY KIND, either express or implied.
** See the Licensefor the specific language governing permissions and
** limitations underthe License.
*/
#define LOG_NDEBUG 0
#define LOG_TAG"PmpsManager-JNI"
#include"utils/Log.h"
#include<stdio.h>
#include<assert.h>
#include<limits.h>
#include<unistd.h>
#include<fcntl.h>
#include"jni.h"
#include"JNIHelp.h"
#include"android_runtime/AndroidRuntime.h"
//----------------------------------------------------------------------------
using namespaceandroid;
static voidandroid_pmps_PmpsManager_sayHello(JNIEnv *env, jobject thiz)
{
LOGV("sayHello()");
}
static constJNINativeMethod method_table[] = {
{"sayHello","()V", (void*)android_pmps_PmpsManager_sayHello},
};
// This function onlyregisters the native methods
intregister_android_pmps_PmpsManager(JNIEnv *env) {
inti;
LOGI("JNI_OnLoad:register_android_pmps_PmpsPlayer");
returnAndroidRuntime::registerNativeMethods(env,
"android/pmps/PmpsManager",method_table, NELEM(method_table));
}
jintJNI_OnLoad(JavaVM* vm, void* reserved)
{
JNIEnv* env = NULL;
jint result = -1;
if (vm->GetEnv((void**) &env,JNI_VERSION_1_4) != JNI_OK) {
LOGE("ERROR: GetEnvfailed\n");
goto bail;
}
assert(env != NULL);
if (register_android_pmps_PmpsManager(env)< 0) {
LOGE("ERROR: PmpsManager nativeregistration failed\n");
goto bail;
}
/* success -- return valid version number*/
result = JNI_VERSION_1_4;
bail:
return result;
}
以上是“framwork新加模塊有哪些”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。