游戏项目中遇到的狗屎问题,分享一下解决经验,以一个最基本的程序为例:

test.c

#include "lua.h"
#include "lualib.h"
#include "lauxlib.h"static int about(lua_State *L){lua_pushstring(L,"test by flaribbit");return 1;
}static const struct luaL_Reg funcList[]=
{{"about", about},{0, 0}
};int luaopen_test(lua_State *L)
{luaL_register(L, "test", funcList);return 1;
}

在windows系统和linux系统中,可以直接使用gcc编译,注意链接lua51.dll或者libluajit.so,记得改掉下面命令中的path/to/

gcc test.c path/to/lua51.dll -s -O2 -DNDEBUG -o test.dll
gcc test.c path/to/libluajit.so -s -O2 -DNDEBUG -o libtest.so

然后在lua中调用require"test"就可以导入使用了,打包游戏的时候记得把库放在外面,和love.dll放在一起,不要塞进game.love或者exe

android系统就比较恶心了,自备NDK,以下教程写于windows系统,在test.c所在的目录创建Android.mkApplication.mk,下面的代码中记得修改path/to/,为liblove.so所在的目录(可以直接解压love2d的安装包拿)

Android.mk

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := test
LOCAL_SRC_FILES := test.c
LOCAL_LDFLAGS := -Lpath/to/$(TARGET_ARCH_ABI) -llove
LOCAL_C_INCLUDES := include
include $(BUILD_SHARED_LIBRARY)

Application.mk

APP_CPPFLAGS := -frtti
APP_LDFLAGS := -latomic
APP_ABI := armeabi-v7a arm64-v8a
APP_PLATFORM := android-16
APP_OPTIM := release

然后调用ndk-build编译,日常记得修改path/to/

path/to/ndk-build NDK_PROJECT_PATH=. NDK_APPLICATION_MK=Application.mk APP_BUILD_SCRIPT=Android.mk

会报可能错误链接的warning,问题不大,编译完成后会在libs文件夹里得到两个libtest.so

最后编写lua程序,这里有个巨坑,*.so必须放到/data/data/package.name里面才能被require正确加载,否则会爆类似下面的神秘错误

Errorerror loading module 'test' from file '/sdcard/libtest.so':
dlopen failed: library "/sdcard/libtest.so" needed or dlopened by "/data/app/org.love2d.android.embed-cfg2TKQ-XsSj13FxWVvTUw==/lib/arm64/liblove.so" is not accessible for the namespace "classloader-namespace"Traceback
[C]: at 0x7a3d813a7c
[C]: in function 'require'
/sdcard/prog.lua:2: in main chunk
[C]: in function 'require'
main.lua:2: in main chunk
[C]: in function 'require'
[C]: in function 'xpcall'
[C]: in function 'xpcall'

那么问题来了,如何放到/data/data/package.name里面呢…?

*.so文件打包进game.love,然后用下面的代码copy到save文件夹里,也算是个办法吧。

package.cpath='/data/data/org.love2d.android.embed/files/save/archive/lib?.so;'..package.cpath
love.filesystem.write("libtest.so", love.filesystem.read("libtest.so"))
require "test"

it just works

github

关于love2d引擎require导入C/C++编写的.dll/.so扩展库问题相关推荐

  1. python扩展库导入方式_使用pip安装Python扩展库的方法

    本文节选自作者的<Python编程基础及应用>视频教程.Python编程基础及应用_哔哩哔哩 (゜-゜)つロ 干杯~-bilibili​www.bilibili.com 使用pip进行安装 ...

  2. eclipse中可以导入其它工具编写的RobotFramework脚本吗?

    在Robotframework的官方网站中,提供了非常多的编辑RF的工具.比如Ride,eclipse,sublime,notepad++等. 网上查到的资料,大部分都是Ride这个编辑工具的使用.在 ...

  3. Vue3+TS+Vite无法使用require导入图片的解决方法

    Vue3+TS+Vite无法使用require导入图片的解决方法 问题描述, 当使用const xxx = require('xxx')浏览器会报错, 为啥使用vue-cli脚手架时不会出问题? 是因 ...

  4. 【导入导出测试用例编写】

    导入导出测试用例编写 一.导出模板测试用例 二.导出数据测试用例 三.导入数据测试用例 一.导出模板测试用例 1.检查模板是否可以正常下载正常打开2.检查模板表头格式展示是否正确,与系统列表中的字段是 ...

  5. 自已编写C# DLL 绑定到unity进程进行单步调试

    测试环境一:mac Catalina-10.15.4, vs2019 for mac, unity2019.3.6f1 for mac 要在VS2019的 [适用于UNITY的工具]中,将 [调试程序 ...

  6. python调用c#注意事项_Python调用C#编写的DLL

    起因是工作中需要用的开发编写的DLL,但是它是使用C#编写的,本人不想使用C#去写测试代码,所以需要使用Python来掉这个DLL内的方法 就用这个就很好,不要问为啥不用微软的Ironpython和别 ...

  7. Silverlight实用窍门系列:22.Silverlight使用WebService调用C++,Delphi编写的DLL文件【实例源码下载】...

    在Silverlight程序(非Out of Browser模式)中是无法直接调用DLL的,但是很多的计算或者其他应用程序的调用中我们需要用到DLL的加载.比如调用DLL来识别身份证读卡器传输过来 ...

  8. 小结两种在Python中导入C语言扩展库的方法

    小结两种在Python中导入C语言扩展库的方法 分类: Pythoner2009-08-18 20:44 2563人阅读 评论(1) 收藏 举报 python扩展c语言importstring 一种是 ...

  9. cgic: 为C语言编写CGI的C函数库

    http://www.qqread.com/cgi-perl/v223877.html cgic: 为c语言编写CGI的C函数库 由Thomas Boutell开发 目录 CGIC介绍 怎样写CGIC ...

最新文章

  1. 四连问:API 接口应该如何设计?如何保证安全?如何签名?如何防重?
  2. 在linux挂载网络驱动器,利用centos 6.6 搭建iscsi服务器并在centos挂载iscsi网络驱动器...
  3. 为SQLMap配置WebUI界面
  4. 面试官让我用channel实现sync包里的同步锁,是不是故意为难我?
  5. 音创a55怎么安装系统_教您怎么用光驱重装系统,安装系统教程!
  6. AMQP Connection 127.0.0.1:5672] ERROR [o.s.a.rabbit.connection.CachingConnectionFactory] CachingConn
  7. PaddlePaddle中内置数据集分析
  8. Java贪吃蛇小游戏,我家小AD从小水蛇成长为水中巨蟒!
  9. 语音播放与录音 (五分钟学会用 非常全面)
  10. MapGISK9安装
  11. 思科3650交换机的密码恢复
  12. #EDA(电子设计自动化)
  13. 正确设置 pip,避免There was a problem confirming the ssl certificate问题
  14. 泛微OA e-cology WorkflowCenterTreeData前台接口SQL注入漏洞复现
  15. 吃热狗游戏Java_《我的世界》吃才是王道“食物工艺”让你尝遍八大菜系
  16. 高等数学入门教程 — 自然底数e
  17. uniapp 微信小程序分页方法:uni-pagination分页插件和上拉分页、下拉加载刷新、刷新后回到顶部
  18. 遥感在计算机领域的应用,浅谈遥感技术在测绘领域发展应用.doc
  19. 一个金融行业站SEO优化方案
  20. CEO, CFO,CTO,COO的含义?

热门文章

  1. HNUCM 道具的魅力值(贪心算法)
  2. C/C++编程刷题分享—常见的经典面试题一
  3. 安装CentOS7时选择install后直接黑屏的解决办法
  4. STM32 TM1628程序
  5. 复现I3D遇到的问题
  6. 软件开发生命周期(SDLC) 【详解】(含公司产品研发流程图、大厂研发架构图、大厂研发流程图)
  7. SQL效率低下常见原因汇总
  8. 华为2019开发者大会内容小记
  9. 互联网单点登录集成方案
  10. 60-硅谷课堂6-硅谷课堂-公众号消息和微信授权-- 笔记