? ? ? ? ? ? ? ? ? ? ? ? ? ? ?so動態庫生成說明以及遇到的坑
? ??????關于安卓的so庫開發的摸索,以下是我個人的開發經歷總結以及踩過的坑,希望對大家有所幫助,一起進步!下面說明下具體的開發步驟:
一、新建一個加載庫文件并且聲明和調用動態庫本地方法的a.java文件
? ? ? ? 開發so庫,對應需要創建編寫一個帶有native聲明的方法的java類,
java類中定義static方法加載動態鏈接庫,大概如下圖:
二、??生成a.java對應的.h的文件
????????在android studio自帶的終端里面cd到工程名路徑\app\build\intermediates\classes\debug目錄下,編寫命令javah -d? jni文件夾名(可自己定義)? ?類全名(路徑+類名),比如:javah -d jni com.app.example.GpayTestJ 即可對應會生成以下.h文件。
注意這里有個坑:android studio2.2之后的版本有變動, build的文件對應的classes路徑有所變動,變成了如下的路徑:
build\intermediates\javac\debug\compileDebugJavaWithJavac\classes\
3.??????新建對應的.c文件
在2執行后對應生成的jni文件夾下面新建一個任意命名的.c文件,做好對應的方法實現,這里就要看個人大佬的c語言的功底了。
4.?????創建.mk文件
在jni文件夾下新建Android.mk文件
LOCAL_PATH := $(call my-dir)?????????? //固定寫法,把路徑賦給LOCAL_PATH變量
include $(CLEAR_VARS)????????????????? //清除其他LOCAL變量
LOCAL_MODULE := nativeTest???????????? //這個模塊的名字,最后生成的.so的名字就是它,要跟java里面的loadLibray的名字一樣。
LOCAL_SRC_FILES := nativeTest.cpp???? //這里是要編譯的文件,
include $(BUILD_SHARED_LIBRARY)??????? //SHARED_LIBRARY就是動態庫,即.so文件
ps:這里的寫法是最簡單的一個例子,用的時候把注釋去掉。每一行都是很關鍵,不能省略。至于makefile怎么編寫內容比較多,此處不贅述
注意這有個坑:.mk文件的名字一定要是Android.mk,不然ndk-build時生成so會失敗?。。。。。。。。。。?/b>
5.?????? 生成so庫文件
在步驟2的路徑下直接ndk-build即可生成so庫文件。
另外:自己創建的jni文件夾也可放到src下面,只要對應cd到它的根路徑下,然后直接ndk-build也可以生成對應的so庫文件。
以上為大概的so庫開發編成,以及個人遇到的坑,描述與不正確或者不妥的,歡迎指出來交流!?。?/p>