NDK學習(5) 安卓平臺下 NDK編譯lua
折騰了大半天lua....很蛋疼!
lua的編譯有2種方式:
1.先編譯原始碼成靜態庫,再把靜態庫嵌入到用到他的jni程式裡
2. 直接把原始碼和jni一起編譯
推薦方式1,這樣靜態庫我們以後還用得著的話,會方便很多
順便說下編譯過程的幾個坑。。。。
方式1:
新建目錄 lua/jni 把亂原始碼放進去,再新建android.mk 把lua檔案列表寫進去
檔案很多,可以參考WINDOWS下lua編譯的檔案列表,一樣的.這裡直接給出檔案,大家可以copy方便
第一步:
Android.mk:
LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := lua LOCAL_SRC_FILES := lapi.c lauxlib.c lbaselib.c lcode.c ldblib.c ldebug.c ldo.c ldump.c lfunc.c lgc.c linit.c liolib.c llex.c lmathlib.c lmem.c loadlib.c lobject.c lopcodes.c loslib.c lparser.c lstate.c lstring.c lstrlib.c ltable.c ltablib.c ltm.c lundump.c lvm.c lzio.c LOCAL_LDLIBS := -ld -lm include $(BUILD_STATIC_LIBRARY)
LOCAL_LDLIBS := -ld -lm 可以刪除 建議大家刪掉 這裡沒用。
原始碼編譯好了,我們現在需要寫個檔案讓他跟java互動不是嗎,因為JAVA和C/C++的資料型別不一樣的。
第二步:
然後就從網上下載luajava檔案,當然我下面會提供給大家的,網上也有,關鍵是用了好幾個都是程式崩潰...。
然後就是編譯這個luajava檔案。
新建目錄 :luajava/jni
把luajava.c 放進去,把lua編譯出來的靜態庫也放進去。另外需要把Lua的4個頭檔案也放進去:lua.h lauxlib.h luaconfig.h lualib.h
然後編寫Android.mk
LOCAL_PATH:= $(call my-dir) # 需要把靜態庫匯入 # include $(CLEAR_VARS) LOCAL_MODULE := lua LOCAL_SRC_FILES := liblua.a include $(PREBUILT_STATIC_LIBRARY) # 第二個為動態庫,在動態庫中使用我們編譯的靜態庫 include $(CLEAR_VARS) LOCAL_MODULE := luajava LOCAL_SRC_FILES := luajava.c LOCAL_STATIC_LIBRARIES := lua include $(BUILD_SHARED_LIBRARY)
其中 liblua.a是第一步裡面生成的。
執行
ndk-build 生成了luajava.so ,好了,完事。
方式2:和第一種差不多,簡單說下:
lua原始碼和luajava全放到一個jni目錄下,
編寫Android.mk:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := luajava
LOCAL_SRC_FILES := lapi.c lauxlib.c lbaselib.c lcode.c ldblib.c ldebug.c ldo.c ldump.c lfunc.c lgc.c linit.c liolib.c llex.c lmathlib.c lmem.c loadlib.c lobject.c lopcodes.c loslib.c lparser.c lstate.c lstring.c lstrlib.c ltable.c ltablib.c ltm.c lundump.c lvm.c lzio.c luajava.c
include $(BUILD_SHARED_LIBRARY)
ndk-build 生成成功. 和第一種的第一步一樣,就是多了個luajava.c檔案。。。。。。
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
下面是安卓呼叫了。首先下載後面提供的java程式碼,放到安卓工程的src目錄,並且把luajava放到lib目錄
import org.keplerproject.luajava.*;//包含luajava的原始碼
在需要測試的地方:
LuaState L = LuaStateFactory.newLuaState();
L.openLibs();
L.LdoString("text = 1+98");
L.getGlobal("text");
String text = L.toString(-1);
super.onCreate(savedInstanceState);
TextView tv = new TextView(this);
tv.setText(text);
setContentView(tv);
到此為止了,有問題大家可以交流下,另外說下,最好下載我給的luajava ,網上的我被坑了1天,就是編譯出來,安卓執行報錯崩潰!。
資源下載:http://download.csdn.net/detail/a289672082/8533847