NDK学习(5) 安卓平台下 NDK编译lua

时间:2021-09-06 17:43:47

折腾了大半天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