2

我想我昨天大部分时间都在努力解决这个问题,任何帮助都将不胜感激,让我非常高兴!即使是试图找到问题根源的下一步也是我目前所坚持的事情!

我有一个 Android 2.2 项目试图引用预构建的 LuaJIT 静态库,但 ndk-build 给了我这个错误:

test_android.cpp:25: undefined reference to `luaL_newstate' 

我将 LuaJIT 构建为 liblua.a,我已经将它放在我的 JNI 目录的根目录中,并带有相关的头文件。我有一个 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    := test
LOCAL_CFLAGS    := -Werror
LOCAL_SRC_FILES := test_android.cpp
LOCAL_LDLIBS    := -llog -lGLESv2

LOCAL_STATIC_LIBRARIES := lua
include $(BUILD_SHARED_LIBRARY)

在 test_andrdoid.cpp 我有这个代码:

extern "C"
{
#include "lua.h"
#include "lauxlib.h"
#include "lualib.h"
}

void test()
{
    lua_State* lua = lua_open();
}

这似乎是一个链接器错误,由于某种原因,静态库文件没有被正确引用。但是,对我来说,makefile 似乎是正确的。

任何帮助将不胜感激!

  1. 首先:是否可以查看所有内容是如何链接在一起的,以及我的共享库模块是否真的可以访问静态库?

附加信息

这是我认为可能相关的额外信息!

建立图书馆

也许是静态库文件不正确?(有什么地方可以下载预建的来检查吗?)。我用这个脚本(来自 LuaJIT 网站)制作了它。我正在使用最新的稳定 LuaJIT,1.1.8

NDK=/cygdrive/c/android-ndk-r8b
NDKABI=8
NDKVER=$NDK/toolchains/arm-linux-androideabi-4.4.3
NDKP=$NDKVER/prebuilt/linux-x86/bin/arm-linux-androideabi-
NDKF="--sysroot $NDK/platforms/android-$NDKABI/arch-arm"
make linux HOST_CC="gcc -m32" CROSS=$NDKP TARGET_FLAGS="$NDKF"

这可以很好地构建并在 /src/ 目录中创建一个 liblua.a。(我在上面运行了 nm,它列出了我期望的所有函数原型)。我不知道我还能做些什么来确保它真的是为 ARM 构建的吗?

NDKABI=8 表示我的目标是 Android 2.2

设置测试 Android 项目

我使用以下命令创建了一个全新的 2.2 android 项目:

android create project --target 3 --name test --path . --activity TestActivity --package com.test

Target 3 映射到我系统上的 Android 2.2(使用android list devices)。我创建了 jni 文件夹并有一个 test_android.h 和 test_android.cpp。然后我使用 ndk-build 来构建它们——当我不尝试引用 LuaJIT 时它工作得很好。当我尝试使用 Lua 时,出现以下错误:

完整的错误信息

Cygwin         : Generating dependency file converter script
Compile++ thumb  : test <= test_android.cpp
In file included from jni/test_android.h:3:0, from jni/test_android.cpp:2:
    C:/android-ndk-r8b/platforms/android-8/arch-arm/usr/include/jni.h:592:13: note:
    the mangling of 'va_list' has changed in GCC 4.4
Prebuilt       : liblua.a <= jni/
StaticLibrary  : libstdc++.a
SharedLibrary  : libtest.so
obj/local/armeabi/objs/test/test_android.o: In function `test()':
C:\Users\Grrr\Documents\mycode\static_lib_test/jni/test_android.cpp:25: undefined reference to `luaL_newstate'
collect2: ld returned 1 exit status
/cygdrive/c/android-ndk-r8b/build/core/build-binary.mk:378: recipe for target `obj/local/armeabi/libtest.so' failed make: *** [obj/local/armeabi/libtest.so] Error 1

我看到的大多数问题都是由于本地图书馆包括订单,因为我只有一个图书馆,这不应该是一个问题,并表明我已经设法得到了一些更根本的错误:)

更新

我已经构建了普通的 Lua 并将其添加为预构建的静态库,它工作正常。我怀疑它是如何构建 LuaJIT 的,但我不确定如何正确构建它,或者找到一个有效的预构建版本。

4

1 回答 1

0

这个链接很好,或者至少makefile是。问题是 LuaJIT 库不是为 ARM 构建的(我使用 objdump -a lualib.a 来检查这个)。我下载了最新的 LuaJIT,在 linux 下运行脚本,得到了一个 ARM 库。现在一切都很好地链接!

于 2012-09-15T18:07:28.397 回答