當前位置:首頁 » 安卓系統 » 靜態庫android

靜態庫android

發布時間: 2023-01-21 19:46:04

1. 安卓如何鏈接靜態庫

關於編譯靜態庫:
android.mk和xxx.cpp放在新文件夾里:
LOCAL_PATH:= $(call my-dir)include $(CLEAR_VARS)
LOCAL_SRC_FILES:= \xxx.cpp
LOCAL_MODULE:= libx
include $(BUILD_STATIC_LIBRARY)
生成靜態庫libx.a文件

關於鏈接靜態庫:
有兩種方法:
1、把libx.a文件放在android.mk同一目錄下,添加:
LOCAL_PREBUILT_LIBS += libx.a
2、同上,添加:
include $(CLEAR_VARS)LOCAL_MODULE := libxLOCAL_SRC_FILES := libx.ainclude $(PREBUILT_STATIC_LIBRARY)LOCAL_STATIC_LIBRARIES += libx
貌似第二種是NDK里比較常見,第一種在其他的android.mk里比較常見。

2. android的動態載入和靜態載入的區別

兩者區別:
一,靜態庫的使用需要:
1
包含一個對應的頭文件告知編譯器lib文件裡面的具體內容
2
設置lib文件允許編譯器去查找已經編譯好的二進制代碼
二,動態庫的使用:
程序運行時需要載入動態庫,對動態庫有依賴性,需要手動加入動態庫
三,依賴性:
靜態鏈接表示靜態性,在編譯鏈接之後,
lib庫中需要的資源已經在可執行程序中了,
也就是靜態存在,沒有依賴性了
動態,就是實時性,在運行的時候載入需要的資源,那麼必須在運行的時候提供
需要的
動態庫,有依賴性,
運行時候沒有找到庫就不能運行了
四,區別:
簡單講,靜態庫就是直接將需要的代碼連接進可執行程序;動態庫就是在需要調用其中的函數時,根據函數映射表找到該函數然後調入堆棧執行。
做成靜態庫可執行文件本身比較大,但不必附帶動態庫
做成動態庫可執行文件本身比較小,但需要附帶動態庫
五:
首先糾正所謂「靜態連接就是把需要的庫函數放進你的exe之中」的說法。在真實世界中,有三個概念:Use
static
libary,
static
linked
DLL,
dynamic
linked
DLL.
多數人混淆了static
libary

static
linked
DLL的概念,當然他們有似是而非的「相似之處」,比如都用到.lib,下面具體說明。
使用靜態庫(Use
static
libary)是把.lib和其他.obj一起build在目標文件中,目標文件可以是.exe,也可以是.dll或.oxc等。一般情況下,可以根本就沒有「對應的」.dll
文件,如C
Run
Time(CRT)庫。一個例子就是,寫一個main(){},build出來並不是只有幾個位元組,當然有人會說那還有exe文件頭呢?是,即使加上文件頭的尺寸,build出的執行文件仍然「莫名的大」。實際上那多出來的部分就是CRT靜態庫。姑且可以把靜態庫.lib理解成外部程序的obj文件比較合理,它包含了函數的實現。

3. 如何在android studio中用JNI調用靜態庫

NDK中 apps下本身就有一個例子,two-libs,就是引用靜態庫。
LOCAL_PATH:= $(call my-dir)

# first lib, which will be built statically
#
include $(CLEAR_VARS)

LOCAL_MODULE := libtwolib-first
LOCAL_SRC_FILES := first.c

include $(BUILD_STATIC_LIBRARY)

# second lib, which will depend on and include the first one
#
include $(CLEAR_VARS)

LOCAL_MODULE := libtwolib-second
LOCAL_SRC_FILES := second.c

LOCAL_STATIC_LIBRARIES := libtwolib-first

include $(BUILD_SHARED_LIBRARY)

4. android 怎麼引用一個靜態庫

由於工作需要,需要在framework中增加自己的動態庫,並且動態庫需要使用合作方提供的第三方靜態庫。但是在引入靜態庫編譯動態庫時總是提示失敗。具體如下:

1. 文件列表

可以看出這個配置文件的內容主要分為兩部分,第一部分預編譯靜態庫,這一過程不觸發構建過程,僅僅是重起了個名字,並且將該庫拷貝到某個路徑下(具體可以參看另一篇文章,NDK使用二進制庫的方法);第二部分是用於編譯動態本地庫,可以看出它通過LOCAL_STATIC_LIBRARIES關鍵字引入了之前預編譯的靜態庫。

5. Android中靜態庫和共享庫的區別

簡單來講:
靜態庫是在連接階段直接拷貝到代碼中使用的,而共享庫是由載入器載入到內存,在運行時使用的。
編譯出來的靜態庫(這里指jar包)里每個java文件對應的class文件都單獨存在,可以直接導入Eclipse等IDE使用
而編譯出來的共享庫(jar包),內部是Android位元組碼Dex格式的文件,一般無法導入Eclipse等IDE使用。Android.mk中由BUILD_JAVA_LIBRARY指定生成共享BUILD_STATIC_JAVA_LIBRARY指定生成靜態庫。

6. 如何在android studio中用JNI調用靜態庫

android ndk開發經常遇到了動態庫的問題,本文主要介紹: ① 動態鏈接庫的生成; ② 在Java和C混合編程的情況下如何調用第三方動態鏈接庫; ③ 使用dlopen程序運行時直接調用; ④ 純c的方式開發調用; 本文重點推薦②和④,第③中太麻煩每個函數都需要dlsym調用一次; 代碼的網路雲鏈接: pan/s/1dD3qkQ9 密碼:c5s3 工具/原料 Win8/article/63f236280b90690208ab3d12/article/c910274bfdd000cd371d2d4b/p/3247530080 2 根據「生成動態庫」中的過程1到10,新建一個純c的ndk程序: 「D:\Android\android-ndk-r10\samples\native-activity" 3 把會用的so文件的目錄libs拷貝到 jni目錄下面 4 修改 Android.mk 文件,內容如下: LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := fkAdd LOCAL_SRC_FILES := libs/$(TARGET_ARCH_ABI)/libfkAdd.so include $(PREBUILT_SHARED_LIBRARY) include $(CLEAR_VARS) LOCAL_MODULE := main LOCAL_SRC_FILES := main.c LOCAL_LDLIBS := -llog -landroid -lEGL -lGLESv1_CM LOCAL_STATIC_LIBRARIES := android_native_app_glue LOCAL_SHARED_LIBRARIES := fkAdd include $(BUILD_SHARED_LIBRARY) include $(CLEAR_VARS) LOCAL_MODULE := native-activity LOCAL_SRC_FILES := NativeActivity.c LOCAL_LDLIBS := -llog -landroid LOCAL_STATIC_LIBRARIES := android_native_app_glue include $(BUILD_SHARED_LIBRARY) $(call import-mole,android/native_app_glue) 5 增加 NativeActivity.c 文件,添加內容如下: #include <jni.h> #include <errno.h> #include <dlfcn.h> #include <android_native_app_glue.h> void android_main(struct android_app* state) { // Make sure glue isn't stripped. app_mmy(); void* soAdd = dlopen("/data/data/com.example.native_activity/ lib/libfkAdd.so",RTLD_NOW); void* soMain = dlopen("/data/data/com.example.native_activity/ lib/libmain.so",RTLD_NOW); void (*fp_android_main)(struct android_app*) = (void (*)(struct android_app*))dlsym(soMain,"android_main"); fp_android_main(state); dlclose(soMain); dlclose(soAdd); } 6 在 main.c 文件中添加一行,方便測試: __android_log_print(ANDROID_LOG_DEBUG, "fuke", "engine_handle_input 100 + 200 = [%d] ", fkAdd(100, 200)); 7 編譯運行,點擊手機屏幕後,觀察logcat 效果如下: END 注意事項 c++的函數在寫動態鏈接庫的時候,需要注意的是c++的函數會被系統修改,所以做動態庫測試的使用最好用c語言

熱點內容
ps3連ftp 發布:2025-05-20 04:19:11 瀏覽:816
計算機編譯干什麼的 發布:2025-05-20 04:05:18 瀏覽:46
安卓如何調手機時間 發布:2025-05-20 04:01:31 瀏覽:916
風扇轉壓縮機不轉 發布:2025-05-20 03:57:47 瀏覽:284
安卓手機如何測網速慢 發布:2025-05-20 03:55:49 瀏覽:495
用電腦做機房的伺服器 發布:2025-05-20 03:55:48 瀏覽:13
如何修改文件夾修改日期 發布:2025-05-20 03:44:08 瀏覽:831
安卓如何登陸tiktok 發布:2025-05-20 03:30:53 瀏覽:75
linux下執行python 發布:2025-05-20 03:23:30 瀏覽:431
sql查看器 發布:2025-05-20 03:22:53 瀏覽:134