星辰北天 2023-08-08 15:03 采纳率: 40%
浏览 8

关于Android/LuaJIT/Luajava交叉编译不同架构的动态so的问题

刚入门NDK开发,用的是最新的AndroidStudio2023
想进行Android,LUA,以及C的交互开发(LuaJIT里的ffi)
网上大多例子都是基于Linux编译的,
但是我想直接用AS
我想编译LuaJIT+luajava源码,并生成x86/x86_64/arm64-v8a/armeabi-v7a架构的动态so库,然后在安卓里面native调用
该怎么配置呢?

这里现在LuaJIT而没有直接选择Lua的原因就是LuaJIT有ffi拓展库

如果可以的话,顺便讲一下Lua编译动态库的方法,

因为是首次使用NDK这些,有更多的例子才能理解的更加透彻

LuaJIT官网http://luajit.org/download.html

img

关于对应的luajava版本又该怎么选择?

现在的AS里只有CPP,没有以前的jni这类文件夹

img

请求帮助,非常感谢>_<

  • 写回答

1条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2023-08-08 16:05
    关注

    【以下回答由 GPT 生成】

    问题解答:

    首先,为了实现Android、Lua和C语言的交互开发,您需要进行一些配置和安装步骤。以下是一步一步的详细解决方案:

    1. 环境配置

    1. 首先,确保您的Android Studio已经安装并且正确配置了NDK。您可以在 File -> Settings -> Android SDK -> SDK Tools 中检查是否安装了NDK。如果没有安装,请确保安装了最新版的NDK。

    2. 然后,打开您的项目并转到 build.gradle(Module: app) 文件。在 android 部分中添加支持的架构。示例代码如下:

    ```groovy android { // ...

       defaultConfig {
           // ...
    
           // 添加支持的架构
           ndk {
               abiFilters 'armeabi-v7a', 'arm64-v8a', 'x86', 'x86_64'
           }
       }
    
       // ...
    

    } ```

    1. 接下来,点击菜单栏上的 Sync Now 按钮,以确保配置更改生效。

    2. LuaJIT + Luajava 编译

    1. 首先,下载 Luajit 源代码。您可以从官方网站(http://luajit.org/download.html)下载最新版本的源代码,并解压到您的项目目录中。

    2. 然后,打开终端或命令行窗口,并导航到 LuaJIT 源代码的根目录。

    3. 运行以下命令以生成静态库文件(.a 文件):

    shell make HOST_CC="gcc -m32" CROSS=arm-linux-androideabi- TARGET_FLAGS="-O2 -march=armv7-a -mfloat-abi=softfp -fno-exceptions -D__ANDROID__ -D__ARM_EABI__" TARGET_SYS=Linux

    注意替换命令中的 arm-linux-androideabi- 为您的目标架构所需的交叉编译器(例如 aarch64-linux-android-i686-linux-android-x86_64-linux-android-)。

    1. 运行以下命令以生成动态库文件(.so 文件):

    shell make HOST_CC="gcc -m32" CROSS=arm-linux-androideabi- TARGET_FLAGS="-O2 -march=armv7-a -mfloat-abi=softfp -fno-exceptions -D__ANDROID__ -D__ARM_EABI__" TARGET_SYS=Android

    注意:如果您的目标架构是 x86 或 x86_64,则应将 CROSS 参数替换为 i686-linux-android-x86_64-linux-android-

    1. 编译完成后,您将在 src 目录下找到生成的 libluajit.so 文件。将它复制到您的Android Studio项目中的 jniLibs 目录中。

    2. 接下来,下载 Luajava 的源代码。您可以从 GitHub(https://github.com/jasonsantos/luajava)上找到 Luajava 的最新版本。

    3. 将 Luajava 的源代码复制到您的 Android Studio 项目中的 jni 目录中。

    4. jni 目录中创建一个名为 Android.mk 的文件,并将以下内容添加到该文件中:

    ```makefile LOCAL_PATH := $(call my-dir)

    include $(CLEAR_VARS)

    LOCAL_C_INCLUDES := $(LOCAL_PATH)/luajava/jni

    LOCAL_SRC_FILES := \ luajava/jni/LuaJavaAPI.c \ ...

    LOCAL_LDLIBS := -llog

    LOCAL_MODULE := luajava

    include $(BUILD_SHARED_LIBRARY) ```

    ... 替换为 Luajava 源代码中的其他源文件。确保所有的源文件都在 LOCAL_SRC_FILES 中列出。

    1. jni 目录中创建一个名为 Application.mk 的文件,并将以下内容添加到该文件中:

    makefile APP_ABI := armeabi-v7a arm64-v8a x86 x86_64

    这将指定要编译的架构。

    1. 在 Android Studio 中的 build.gradle 文件中,在 android 部分下的 defaultConfig 中添加以下代码来指导 NDK 构建 Luajava:

      ```groovy android { // ...

      defaultConfig {
          // ...
      
          ndk {
              moduleName "luajava"
          }
      }
      
      // ...
      

      } ```

      这将定义生成的动态库的模块名称为 "luajava"。

    2. 现在,您可以编译并运行您的 Android 应用程序来测试 LuaJIT 和 Luajava 的可用性和交互性了。

    3. 关于 Lua 动态库的编译

    对于构建 Lua 动态库的方法,您可以按照以下步骤进行操作:

    1. 首先,下载 Lua 源代码。您可以从官方网站(http://www.lua.org/download.html)下载最新版本的源代码,并解压到您的项目目录中。

    2. 打开终端或命令行窗口,并导航到 Lua 源代码的根目录。

    3. 运行以下命令以生成静态库文件(.a 文件):

    shell make linux

    注意:如果您的目标架构是 x86 或 x86_64,在命令中添加 MYCFLAGS="-DLUA_USE_LINUX"

    1. 运行以下命令以生成动态库文件(.so 文件):

      shell make linux MYCFLAGS="-DLUA_USE_LINUX"

      注意:如果您的目标架构是 x86 或 x86_64,则在命令中添加 MYCFLAGS="-DLUA_USE_LINUX"

    2. 编译完成后,您将在 Lua 源代码的根目录中找到生成的 liblua.so 文件。将它复制到您的 Android Studio 项目中的 jniLibs 目录中。

    关于 luajava 版本的建议:

    根据您提供的链接(https://github.com/jasonsantos/luajava),该存储库是维护过的,并且有一些贡献者。因此,我建议您使用此存储库中的最新版本,以确保获取最新的功能和错误修复。

    关于 Android Studio 中的 CPP 文件夹:

    从 Android Studio 2.2 开始,Google 正式支持 CPP(本机 C++)项目。这意味着您可以在 Android Studio 中更方便地开发 C++ 代码。

    CPP 文件夹实际上是用于存放本机代码(例如 C++ 代码)的文件夹。该文件夹在新版本的 Android Studio 中取代了以前的 jni 文件夹。这不会对您的开发有任何影响,您仍然可以在该文件夹中编写和管理 C++ 代码。

    希望这些解决方案能够帮助您实现您的目标!如果您有任何进一步的问题,请随时提问。


    如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^
    评论

报告相同问题?

问题事件

  • 创建了问题 8月8日

悬赏问题

  • ¥15 无法输出helloworld
  • ¥15 高通uboot 打印ubi init err 22
  • ¥20 PDF元数据中的XMP媒体管理属性
  • ¥15 R语言中lasso回归报错
  • ¥15 网站突然不能访问了,上午还好好的
  • ¥15 有没有dl可以帮弄”我去图书馆”秒选道具和积分
  • ¥15 semrush,SEO,内嵌网站,api
  • ¥15 Stata:为什么reghdfe后的因变量没有被发现识别啊
  • ¥15 振荡电路,ADS仿真
  • ¥15 关于#c语言#的问题,请各位专家解答!