我想我昨天大部分时间都在努力解决这个问题,任何帮助都将不胜感激,让我非常高兴!即使是试图找到问题根源的下一步也是我目前所坚持的事情!
我有一个 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 似乎是正确的。
任何帮助将不胜感激!
- 首先:是否可以查看所有内容是如何链接在一起的,以及我的共享库模块是否真的可以访问静态库?
附加信息
这是我认为可能相关的额外信息!
建立图书馆
也许是静态库文件不正确?(有什么地方可以下载预建的来检查吗?)。我用这个脚本(来自 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 的,但我不确定如何正确构建它,或者找到一个有效的预构建版本。