java嵌入lua有多种方案可选择,比如纯java的luaj、纯C jni的 luajava还有个lua4j。在android中嵌入lua,我偏向使用luajava(当然面对除arm外的平台如x86、mips或需单独打包).

要使用luajava除了要下载luajava还要下载lua源码,需要注意的是luajava并不支持lua2.0以上的版本,我测试支持的版本是5.1.4,而且luajava中缺少头文件luajava.h(本文末提供该文件下载)。下载完后把lua和luajava的luajava.c和luajava.h解压到同一个文件夹,注意:把llex.c源文件的trydecpoint函数中的

ls->decpoint = (cv ? cv->decimal_point[0] : '.');

改为

ls->decpoint =  '.';

不然编译不过。


实际项目中嵌入lua可能我们并不乐意让人轻易知道我们使用了lua。这就要编译so时不输出lua中的api和luajava的Java_org_keplerproject_luajava_LuaState_XXX函数。 关闭lua的api输出,可以在luaconf.h头文件中找到LUA_API宏
#define LUA_API        extern
将它改为
#define LUA_API        extern __attribute__((visibility("hidden")))
而要关闭luajava中输出函数,则需要把luajava中JNIEXPORT标识的函数去除JNIEXPORT,和在JNI_OnLoad中注册所有Java_org_keplerproject_luajava_LuaState_XXX函数(这种函数命名实在是丑陋!)。以下是我整理出来的函数(其中注释掉的函数是luajava中的作者并没有实现的).
static JNINativeMethod METHOD_LUASTATE[]={{"_open", "()Lorg/keplerproject/luajava/CPtr;", (void *)Java_org_keplerproject_luajava_LuaState__1open},{"_close", "(Lorg/keplerproject/luajava/CPtr;)V", (void *)Java_org_keplerproject_luajava_LuaState__1close},{"_newthread", "(Lorg/keplerproject/luajava/CPtr;)Lorg/keplerproject/luajava/CPtr;", (void *)Java_org_keplerproject_luajava_LuaState__1newthread},{"_getTop","(Lorg/keplerproject/luajava/CPtr;)I",(void*)Java_org_keplerproject_luajava_LuaState__1getTop},{"_setTop","(Lorg/keplerproject/luajava/CPtr;I)V",(void*)Java_org_keplerproject_luajava_LuaState__1setTop},{"_pushValue","(Lorg/keplerproject/luajava/CPtr;I)V",(void*)Java_org_keplerproject_luajava_LuaState__1pushValue},{"_remove","(Lorg/keplerproject/luajava/CPtr;I)V",(void*)Java_org_keplerproject_luajava_LuaState__1remove},{"_insert","(Lorg/keplerproject/luajava/CPtr;I)V",(void*)Java_org_keplerproject_luajava_LuaState__1insert},{"_replace","(Lorg/keplerproject/luajava/CPtr;I)V",(void*)Java_org_keplerproject_luajava_LuaState__1replace},{"_checkStack","(Lorg/keplerproject/luajava/CPtr;I)I",(void*)Java_org_keplerproject_luajava_LuaState__1checkStack},{"_xmove","(Lorg/keplerproject/luajava/CPtr;Lorg/keplerproject/luajava/CPtr;I)V",(void*)Java_org_keplerproject_luajava_LuaState__1xmove},{"_isNumber","(Lorg/keplerproject/luajava/CPtr;I)I",(void*)Java_org_keplerproject_luajava_LuaState__1isNumber},{"_isString","(Lorg/keplerproject/luajava/CPtr;I)I",(void*)Java_org_keplerproject_luajava_LuaState__1isString},{"_isCFunction","(Lorg/keplerproject/luajava/CPtr;I)I",(void*)Java_org_keplerproject_luajava_LuaState__1isCFunction},{"_isUserdata","(Lorg/keplerproject/luajava/CPtr;I)I",(void*)Java_org_keplerproject_luajava_LuaState__1isUserdata},{"_type","(Lorg/keplerproject/luajava/CPtr;I)I",(void*)Java_org_keplerproject_luajava_LuaState__1type},{"_typeName","(Lorg/keplerproject/luajava/CPtr;I)Ljava/lang/String;",(void*)Java_org_keplerproject_luajava_LuaState__1typeName},{"_equal","(Lorg/keplerproject/luajava/CPtr;II)I",(void*)Java_org_keplerproject_luajava_LuaState__1equal},{"_rawequal","(Lorg/keplerproject/luajava/CPtr;II)I",(void*)Java_org_keplerproject_luajava_LuaState__1rawequal},{"_lessthan","(Lorg/keplerproject/luajava/CPtr;II)I",(void*)Java_org_keplerproject_luajava_LuaState__1lessthan},{"_toNumber","(Lorg/keplerproject/luajava/CPtr;I)D",(void*)Java_org_keplerproject_luajava_LuaState__1toNumber},{"_toInteger","(Lorg/keplerproject/luajava/CPtr;I)I",(void*)Java_org_keplerproject_luajava_LuaState__1toInteger},{"_toBoolean","(Lorg/keplerproject/luajava/CPtr;I)I",(void*)Java_org_keplerproject_luajava_LuaState__1toBoolean},{"_toString","(Lorg/keplerproject/luajava/CPtr;I)Ljava/lang/String;",(void*)Java_org_keplerproject_luajava_LuaState__1toString},{"_objlen","(Lorg/keplerproject/luajava/CPtr;I)I",(void*)Java_org_keplerproject_luajava_LuaState__1objlen},{"_toThread","(Lorg/keplerproject/luajava/CPtr;I)Lorg/keplerproject/luajava/CPtr;",(void*)Java_org_keplerproject_luajava_LuaState__1toThread},{"_pushNil","(Lorg/keplerproject/luajava/CPtr;)V",(void*)Java_org_keplerproject_luajava_LuaState__1pushNil},{"_pushNumber","(Lorg/keplerproject/luajava/CPtr;D)V",(void*)Java_org_keplerproject_luajava_LuaState__1pushNumber},//{"_pushInteger","(Lorg/keplerproject/luajava/CPtr;I)V",(void*)Java_org_keplerproject_luajava_LuaState__1pushInteger},{"_pushString","(Lorg/keplerproject/luajava/CPtr;Ljava/lang/String;)V",(void*)Java_org_keplerproject_luajava_LuaState__1pushString__Lorg_keplerproject_luajava_CPtr_2Ljava_lang_String_2},{"_pushString","(Lorg/keplerproject/luajava/CPtr;[BI)V",(void*)Java_org_keplerproject_luajava_LuaState__1pushString__Lorg_keplerproject_luajava_CPtr_2_3BI},{"_pushBoolean","(Lorg/keplerproject/luajava/CPtr;I)V",(void*)Java_org_keplerproject_luajava_LuaState__1pushBoolean},{"_getTable","(Lorg/keplerproject/luajava/CPtr;I)V",(void*)Java_org_keplerproject_luajava_LuaState__1getTable},{"_getField","(Lorg/keplerproject/luajava/CPtr;ILjava/lang/String;)V",(void*)Java_org_keplerproject_luajava_LuaState__1getField},{"_rawGet","(Lorg/keplerproject/luajava/CPtr;I)V",(void*)Java_org_keplerproject_luajava_LuaState__1rawGet},{"_rawGetI","(Lorg/keplerproject/luajava/CPtr;II)V",(void*)Java_org_keplerproject_luajava_LuaState__1rawGetI},{"_createTable","(Lorg/keplerproject/luajava/CPtr;II)V",(void*)Java_org_keplerproject_luajava_LuaState__1createTable},{"_getMetaTable","(Lorg/keplerproject/luajava/CPtr;I)I",(void*)Java_org_keplerproject_luajava_LuaState__1getMetaTable},{"_getFEnv","(Lorg/keplerproject/luajava/CPtr;I)V",(void*)Java_org_keplerproject_luajava_LuaState__1getFEnv},{"_setTable","(Lorg/keplerproject/luajava/CPtr;I)V",(void*)Java_org_keplerproject_luajava_LuaState__1setTable},{"_setField","(Lorg/keplerproject/luajava/CPtr;ILjava/lang/String;)V",(void*)Java_org_keplerproject_luajava_LuaState__1setField},{"_rawSet","(Lorg/keplerproject/luajava/CPtr;I)V",(void*)Java_org_keplerproject_luajava_LuaState__1rawSet},{"_rawSetI","(Lorg/keplerproject/luajava/CPtr;II)V",(void*)Java_org_keplerproject_luajava_LuaState__1rawSetI},{"_setMetaTable","(Lorg/keplerproject/luajava/CPtr;I)I",(void*)Java_org_keplerproject_luajava_LuaState__1setMetaTable},{"_setFEnv","(Lorg/keplerproject/luajava/CPtr;I)I",(void*)Java_org_keplerproject_luajava_LuaState__1setFEnv},{"_call","(Lorg/keplerproject/luajava/CPtr;II)V",(void*)Java_org_keplerproject_luajava_LuaState__1call},{"_pcall","(Lorg/keplerproject/luajava/CPtr;III)I",(void*)Java_org_keplerproject_luajava_LuaState__1pcall},{"_yield","(Lorg/keplerproject/luajava/CPtr;I)I",(void*)Java_org_keplerproject_luajava_LuaState__1yield},{"_resume","(Lorg/keplerproject/luajava/CPtr;I)I",(void*)Java_org_keplerproject_luajava_LuaState__1resume},{"_status","(Lorg/keplerproject/luajava/CPtr;)I",(void*)Java_org_keplerproject_luajava_LuaState__1status},{"_gc","(Lorg/keplerproject/luajava/CPtr;II)I",(void*)Java_org_keplerproject_luajava_LuaState__1gc},{"_error","(Lorg/keplerproject/luajava/CPtr;)I",(void*)Java_org_keplerproject_luajava_LuaState__1error},{"_next","(Lorg/keplerproject/luajava/CPtr;I)I",(void*)Java_org_keplerproject_luajava_LuaState__1next},{"_concat","(Lorg/keplerproject/luajava/CPtr;I)V",(void*)Java_org_keplerproject_luajava_LuaState__1concat},{"_pop","(Lorg/keplerproject/luajava/CPtr;I)V",(void*)Java_org_keplerproject_luajava_LuaState__1pop},{"_newTable","(Lorg/keplerproject/luajava/CPtr;)V",(void*)Java_org_keplerproject_luajava_LuaState__1newTable},{"_strlen","(Lorg/keplerproject/luajava/CPtr;I)I",(void*)Java_org_keplerproject_luajava_LuaState__1strlen},{"_isFunction","(Lorg/keplerproject/luajava/CPtr;I)I",(void*)Java_org_keplerproject_luajava_LuaState__1isFunction},{"_isTable","(Lorg/keplerproject/luajava/CPtr;I)I",(void*)Java_org_keplerproject_luajava_LuaState__1isTable},{"_isNil","(Lorg/keplerproject/luajava/CPtr;I)I",(void*)Java_org_keplerproject_luajava_LuaState__1isNil},{"_isBoolean","(Lorg/keplerproject/luajava/CPtr;I)I",(void*)Java_org_keplerproject_luajava_LuaState__1isBoolean},//{"_isThread","(Lorg/keplerproject/luajava/CPtr;I)I",(void*)Java_org_keplerproject_luajava_LuaState__1isThread},{"_isNone","(Lorg/keplerproject/luajava/CPtr;I)I",(void*)Java_org_keplerproject_luajava_LuaState__1isNone},{"_isNoneOrNil","(Lorg/keplerproject/luajava/CPtr;I)I",(void*)Java_org_keplerproject_luajava_LuaState__1isNoneOrNil},{"_setGlobal","(Lorg/keplerproject/luajava/CPtr;Ljava/lang/String;)V",(void*)Java_org_keplerproject_luajava_LuaState__1setGlobal},{"_getGlobal","(Lorg/keplerproject/luajava/CPtr;Ljava/lang/String;)V",(void*)Java_org_keplerproject_luajava_LuaState__1getGlobal},{"_getGcCount","(Lorg/keplerproject/luajava/CPtr;)I",(void*)Java_org_keplerproject_luajava_LuaState__1getGcCount},{"_LdoFile","(Lorg/keplerproject/luajava/CPtr;Ljava/lang/String;)I",(void*)Java_org_keplerproject_luajava_LuaState__1LdoFile},{"_LdoString","(Lorg/keplerproject/luajava/CPtr;Ljava/lang/String;)I",(void*)Java_org_keplerproject_luajava_LuaState__1LdoString},{"_LgetMetaField","(Lorg/keplerproject/luajava/CPtr;ILjava/lang/String;)I",(void*)Java_org_keplerproject_luajava_LuaState__1LgetMetaField},{"_LcallMeta","(Lorg/keplerproject/luajava/CPtr;ILjava/lang/String;)I",(void*)Java_org_keplerproject_luajava_LuaState__1LcallMeta},{"_Ltyperror","(Lorg/keplerproject/luajava/CPtr;ILjava/lang/String;)I",(void*)Java_org_keplerproject_luajava_LuaState__1Ltyperror},{"_LargError","(Lorg/keplerproject/luajava/CPtr;ILjava/lang/String;)I",(void*)Java_org_keplerproject_luajava_LuaState__1LargError},{"_LcheckString","(Lorg/keplerproject/luajava/CPtr;I)Ljava/lang/String;",(void*)Java_org_keplerproject_luajava_LuaState__1LcheckString},{"_LoptString","(Lorg/keplerproject/luajava/CPtr;ILjava/lang/String;)Ljava/lang/String;",(void*)Java_org_keplerproject_luajava_LuaState__1LoptString},{"_LcheckNumber","(Lorg/keplerproject/luajava/CPtr;I)D",(void*)Java_org_keplerproject_luajava_LuaState__1LcheckNumber},{"_LoptNumber","(Lorg/keplerproject/luajava/CPtr;ID)D",(void*)Java_org_keplerproject_luajava_LuaState__1LoptNumber},{"_LcheckInteger","(Lorg/keplerproject/luajava/CPtr;I)I",(void*)Java_org_keplerproject_luajava_LuaState__1LcheckInteger},{"_LoptInteger","(Lorg/keplerproject/luajava/CPtr;II)I",(void*)Java_org_keplerproject_luajava_LuaState__1LoptInteger},{"_LcheckStack","(Lorg/keplerproject/luajava/CPtr;ILjava/lang/String;)V",(void*)Java_org_keplerproject_luajava_LuaState__1LcheckStack},{"_LcheckType","(Lorg/keplerproject/luajava/CPtr;II)V",(void*)Java_org_keplerproject_luajava_LuaState__1LcheckType},{"_LcheckAny","(Lorg/keplerproject/luajava/CPtr;I)V",(void*)Java_org_keplerproject_luajava_LuaState__1LcheckAny},{"_LnewMetatable","(Lorg/keplerproject/luajava/CPtr;Ljava/lang/String;)I",(void*)Java_org_keplerproject_luajava_LuaState__1LnewMetatable},{"_LgetMetatable","(Lorg/keplerproject/luajava/CPtr;Ljava/lang/String;)V",(void*)Java_org_keplerproject_luajava_LuaState__1LgetMetatable},{"_Lwhere","(Lorg/keplerproject/luajava/CPtr;I)V",(void*)Java_org_keplerproject_luajava_LuaState__1Lwhere},{"_Lref","(Lorg/keplerproject/luajava/CPtr;I)I",(void*)Java_org_keplerproject_luajava_LuaState__1Lref},{"_LunRef","(Lorg/keplerproject/luajava/CPtr;II)V",(void*)Java_org_keplerproject_luajava_LuaState__1LunRef},{"_LgetN","(Lorg/keplerproject/luajava/CPtr;I)I",(void*)Java_org_keplerproject_luajava_LuaState__1LgetN},{"_LsetN","(Lorg/keplerproject/luajava/CPtr;II)V",(void*)Java_org_keplerproject_luajava_LuaState__1LsetN},{"_LloadFile","(Lorg/keplerproject/luajava/CPtr;Ljava/lang/String;)I",(void*)Java_org_keplerproject_luajava_LuaState__1LloadFile},{"_LloadBuffer","(Lorg/keplerproject/luajava/CPtr;[BJLjava/lang/String;)I",(void*)Java_org_keplerproject_luajava_LuaState__1LloadBuffer},{"_LloadString","(Lorg/keplerproject/luajava/CPtr;Ljava/lang/String;)I",(void*)Java_org_keplerproject_luajava_LuaState__1LloadString},{"_Lgsub","(Lorg/keplerproject/luajava/CPtr;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;",(void*)Java_org_keplerproject_luajava_LuaState__1Lgsub},{"_LfindTable","(Lorg/keplerproject/luajava/CPtr;ILjava/lang/String;I)Ljava/lang/String;",(void*)Java_org_keplerproject_luajava_LuaState__1LfindTable},{"_openBase","(Lorg/keplerproject/luajava/CPtr;)V",(void*)Java_org_keplerproject_luajava_LuaState__1openBase},{"_openTable","(Lorg/keplerproject/luajava/CPtr;)V",(void*)Java_org_keplerproject_luajava_LuaState__1openTable},{"_openIo","(Lorg/keplerproject/luajava/CPtr;)V",(void*)Java_org_keplerproject_luajava_LuaState__1openIo},{"_openOs","(Lorg/keplerproject/luajava/CPtr;)V",(void*)Java_org_keplerproject_luajava_LuaState__1openOs},{"_openString","(Lorg/keplerproject/luajava/CPtr;)V",(void*)Java_org_keplerproject_luajava_LuaState__1openString},{"_openMath","(Lorg/keplerproject/luajava/CPtr;)V",(void*)Java_org_keplerproject_luajava_LuaState__1openMath},{"_openDebug","(Lorg/keplerproject/luajava/CPtr;)V",(void*)Java_org_keplerproject_luajava_LuaState__1openDebug},{"_openPackage","(Lorg/keplerproject/luajava/CPtr;)V",(void*)Java_org_keplerproject_luajava_LuaState__1openPackage},{"_openLibs","(Lorg/keplerproject/luajava/CPtr;)V",(void*)Java_org_keplerproject_luajava_LuaState__1openLibs},{"luajava_open","(Lorg/keplerproject/luajava/CPtr;I)V",(void*)Java_org_keplerproject_luajava_LuaState_luajava_1open},{"_getObjectFromUserdata","(Lorg/keplerproject/luajava/CPtr;I)Ljava/lang/Object;",(void*)Java_org_keplerproject_luajava_LuaState__1getObjectFromUserdata},{"_isObject","(Lorg/keplerproject/luajava/CPtr;I)Z",(void*)Java_org_keplerproject_luajava_LuaState__1isObject},{"_pushJavaObject","(Lorg/keplerproject/luajava/CPtr;Ljava/lang/Object;)V",(void*)Java_org_keplerproject_luajava_LuaState__1pushJavaObject},{"_pushJavaFunction","(Lorg/keplerproject/luajava/CPtr;Lorg/keplerproject/luajava/JavaFunction;)V",(void*)Java_org_keplerproject_luajava_LuaState__1pushJavaFunction},{"_isJavaFunction","(Lorg/keplerproject/luajava/CPtr;I)Z",(void*)Java_org_keplerproject_luajava_LuaState__1isJavaFunction}};
OK!最后将org.keplerproject.luajava包名和类名也一同改改(当然如果 改了也要注意修改so中的函数签名),再给so取个其他的什么名字^_^。希望本文对您有所帮助。

更多相关文章

  1. android 分析method profiling
  2. 【Tensorflow】Tensorflow移植Android上的过程和坑
  3. Android(安卓)Studio系列教程(六) Gradle多渠道打包
  4. Android(安卓)RadioButton用代码去圆点失效的问题解决
  5. android中的设计模式--观察者模式
  6. Android(安卓)-- IPC通信机制之一Binder简介
  7. android gen 目录消失
  8. matix in Android
  9. MAC下Android(安卓)Studio 1.4编译构建Cocos2d-x 3.9之Android版

随机推荐

  1. Android(安卓)Flurry使用说明
  2. Android(安卓)实现简单当前时间点的天气
  3. Android(安卓)2.2 API Demos -- 通过调用
  4. Android中的自定义注解
  5. android中画廊视图Gallery和ImageSwitche
  6. Android(安卓)Universal-Iamge-Loader的D
  7. 深入源码分析Handler的消息处理机制
  8. android后台布局
  9. mac下配置android studio工具
  10. Android判断app是否后台运行中,后台运行通