1. 程式人生 > >cocos2dx android ndk 載入動態庫(.so)

cocos2dx android ndk 載入動態庫(.so)

當專案開發到一定階段,基本上需要接入第三方sdk的了,ios上還比較好辦,就不說了。android上步驟是比較繁瑣的。

通常sdk會叫你把動態庫檔案扔到專案的libs中,但Cocos2dx在編譯時會把libs目錄下的東西清空,然後從其他地方引入的,所以不能直接放進去。

關於prebuilt,有一個地方先留意參考一下,cocos2dx本身會引入一些靜態庫(.a),例如curl之類的,可以在cocos2dx/platform/third_party/android/prebuilt目錄下找到。那這些靜態庫是如何載入進去的呢,可以在專案中的proj.android/jni/Android.mk中找到答案。

這裡先不說載入靜態庫,因為比較簡單。


好了~~開始了



好了,開始介紹如何引入,方法有兩種
例如要載入一個靜態庫檔案 libdynamic1.so

方法1:
把libdynamic1.so放到proj.android/jni/下

編輯 proj.android/jni/Android.mk
在最末尾加入
#----
include $(CLEAR_VARS)
LOCAL_MODULE     := entry
LOCAL_SRC_FILES := libdynamic1.so
include $(BUILD_SHARED_LIBRARY)
#----
儲存退出,然後執行build_native.sh,就會發現多了Install lib dynamic1.so的輸出了。

如果要加入多個動態庫,就參考上面所說的,在proj.anroid/jni/下建立多個資料夾,然後在Android.mk上繼續增加上面的語句就行。

方法2:
proj.android/jni/下新建一個libdynamic1的資料夾,裡面新建一個Android.mk,
然後在libdynamic1資料夾下再建一個armeabi資料夾,這個是關於編譯的CPU型別的,在其裡面放進libdynamic1.so
整體結構就是
libdynamic1/Android.mk
libdynamic1/armeabi/libdynamic1.so
Android.mk的內容為:
#---
LOCAL_PATH := $(call my-dir)


include $(CLEAR_VARS)
LOCAL_MODULE     := dynamic1
LOCAL_SRC_FILES := $(TARGET_ARCH_ABI)/libdynamic1.so
include $(PREBUILT_SHARED_LIBRARY)
#---

這裡涉及到NDK_MODULE_PATH,其實就是呼叫call import-module的搜尋路徑,可以在proj.android/build_native.sh中查到它的定義。
跟方法1不同,這次在Android.mk加入的語句為

include $(BUILD_SHARED_LIBRARY)
前加入
LOCAL _SHARED_LIBRARIES := dynamic1
如果加入多個,即為
LOCAL _SHARED_LIBRARIES := dynamic1 dynamic2 dynamic3
然後在檔案末尾,加入
$(call import-module,projects/專案名/proj.android/jni/libdynamic1)
加入多個的話雷同。

到這裡為止,已經成功將動態庫引入進來了,然後就是載入,
在主java裡找到
static {
     System.loadLibrary("cocos2dlua");
}
加入自己要載入的東西就可以了
static {
     System.loadLibrary("dynamic1");
     System.loadLibrary("cocos2dlua");

}

相關推薦

cocos2dx android ndk 載入動態(.so)

當專案開發到一定階段,基本上需要接入第三方sdk的了,ios上還比較好辦,就不說了。android上步驟是比較繁瑣的。通常sdk會叫你把動態庫檔案扔到專案的libs中,但Cocos2dx在編譯時會把libs目錄下的東西清空,然後從其他地方引入的,所以不能直接放進去。關於pr

windows下使用cmake和ndk編譯android所用動態.so和靜態.a

      不在linux上編譯android所用.a和.so,在windows上如何編譯呢?  1.準備工作:  2.開始寫一點點程式碼 使用java宣告個native函式: package android.jni.test; public class Nativ

android NDK開發及調用標準linux動態 so文件

als 一起 當前 api 之前 flags 負責 文件的 基礎 預備知識及環境搭建 1、NDK(native development Kit)原生開發工具包,用來快速開發C、C++動態庫,並能自動將so文件和java應用一起打包成apk.對應:jni層c++開發

Android Studio打包APK後動態so檔案被改動

本人專案中遇到一個非常奇葩的問題,百思不得其解。 問題是這樣的: 由於專案是將C/C++層的程式碼與java程式碼分開管理的,所以C/C++程式碼沒有放進AS裡,編譯時將在linux下編譯好的動態庫直接放進AS工程的jniLibs下再打包生成APK。問題來了。 AS 打包A

外掛載入帶有動態so的apk處理

     外掛載入帶有動態庫的apk時,會報UnsatisfiedLinkError找不到動態庫的錯誤。 解決方法是在DexClassLoader中 dalvik.system.DexClassLoader.DexClassLoader(String dexPath, S

單目跟蹤位姿產品研發(二)----在linux下將c++工程打包成動態so檔案API

       單目跟蹤位姿專案由對方公司提供應用場景,我方研發核心演算法,通過c++實現功能,然後對方公司通過java\js來開發炫酷的介面,共同合作完成,最終對方公司負責銷售推廣,推向市場。因此,涉及到java介面呼叫c++核心程式碼的問題。 現記錄

Linux下動態(.so)和靜態(.a) 的區別 Linux下動態(.so)和靜態(.a) 的區別 動態(.so)連結靜態(.a)的情況總結

Linux下動態庫(.so)和靜態庫(.a) 的區別   靜態庫在程式編譯時會被連線到目的碼中,程式執行時將不再需要該靜態庫。編譯之後程式檔案大,但載入快,隔離性也好。 動態庫在程式編譯時並不會被連線到目的碼中,而是在程式執行是才被載入,因此在程式執行時還需要動態庫存在。多個

沒有載入動態導致的error: symbol lookup error: undefined symbol

做了一個瀏覽器外掛,需要編譯為 abcPlugins.so , 這個.so需要呼叫另外一個業務庫 defLib.so裡面的函式。 把abcPlugins.so替換到目標板上,瀏覽器程序啟動不起來。   1. 查詢瀏覽器程序啟動過程錯誤    1

linux關於執行編譯後命令找不到動態.so檔案的解決辦法。

方法一:(沒有root許可權)利用find找到報錯動態庫檔案目錄lib路徑,vim /home/xxx/.bashrc 新增一行: export LD_LIBRARY_PATH=動態庫/lib:$LD_LIBRARY_PATH 然後 source /home/xxx/.bashrc

Go 生成C動態.so和靜態.a

Go 生成C動態庫.so和靜態庫.a 原始碼 package main import "C" import "fmt" //export hello func hello(){ fmt.Println("hello world") } //export add func

C++載入動態的形式來實現封裝

目錄結構 └── test ├── CMakeLists.txt ├── base.h //設定介面 ├── drive.cpp //具體實現 └── main.cpp

linux下封裝函式——動態.so和靜態.a(程式碼實現及連結方式)

在linux環境下的連結庫分為靜態連結庫(.a庫)和動態連結庫(.so庫),其作用是把C程式編譯好做成一種可執行連結檔案,主程式檔案呼叫這些程式的函式介面是可以使用a庫或so庫,在主程式中只需要include含有庫中提供的函式介面宣告的標頭檔案即可。所以學會如何

通過gcc建立靜態.a、動態.so及其使用

gcc的常用選項 -v:檢視gcc版本 -c:只編譯,生成.o檔案,不進行連結 -g:包含除錯資訊,方便使用gdb除錯 -D:編譯時定義巨集 靜態庫的建立和使用 這裡使用命令ar,常用的選項是: -r:替換歸檔中已有的檔案或加入新檔案 -t:顯示歸檔檔

codeblocks配置生成動態.so的環境

1.建立工程,選擇shared library 2.compiler setting->Other compiler options: -shared -fPIC 4.配置好之後直接編譯即可,.so檔案會生成在工程所在的bin資料夾下 5.呼

OSX10.9 QT5.3.1 關於載入動態(Cannot load library.....)

在LINUX 、WINDOWS程式正常,但在MAC下卻不能載入。如下圖 在生成的APP檔案,右鍵‘顯示包內容’  位定到  fnd_main.app/Contents/MacOS,把生成的動態庫 *.dblib複製進去。 ASSERT: "uint(i) <

Android NDK 如何縮減的大小

Android NDK: how to reduce library size (translate from:link) 當我們剛開始做Algolia的android開發時,二進位制檔案的大小並不是我主要關注的。事實上我們一開始用的是java,後來出於效能的壓迫下才換

C++編寫動態.so或者.dll的陷阱

一、介面不變就可以不需要重新編譯? 對於很多庫的實現者可能會有這樣的認識“介面不變就可以不需要重新編譯”,其實這句話是有前提的,前提是實現的動態庫有足夠的相容性和魯棒性。尤其是C++實現的動態庫,C++只對語言層規則做了規定,沒有二進位制級別的任何規定。 COM本質論裡面的

linux下靜態.a和動態.so檔案的生成和使用

1.靜態庫是一些目標檔案(字尾名為.o)的集合體而已。 2.靜態庫的字尾名是.a,對應於windows作業系統的字尾名為.lib的靜態庫。 3.可以使用ar命令來建立一個靜態庫檔案。 來看一個例項,根據書中的程式碼簡化的,先看一看可以編譯成庫檔案的原始檔中的程式碼: /* test.c */ i

更改PE檔案載入動態

最近看了《逆向工程核心原理》,其中第25.4節講了更改PE檔案讓目標檔案載入我們的動態庫。現在做一下完整介紹。 PE檔案的匯入DLL資訊儲存在IDT中,於是我們只需將DLL加到目標PE檔案的IDT中,這時我們得先看一下IDT的空間大小。 1.檢視IDT: 首先用PEVie

Linux動態.a與動態.so的生成與區別、以及.so檔案的封裝與使用

一、前言 如果有公司需要使用你們產品的一部分功能(通過程式碼呼叫這些功能),如果不想提供原始碼,那麼就可以通過封裝成庫檔案的形式提供給對方使用。本文主要介紹了生成動態庫與靜態庫檔案的過程、以及封裝和使用庫檔案的方法。 二、靜態庫.a與動態庫.so的生成與