1. 程式人生 > >NDK學習(5) 安卓平臺下 NDK編譯lua

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