Я думаю, что большую часть вчерашнего дня я безуспешно боролся с этим, любая помощь будет очень признательна и сделает меня очень счастливым! Даже следующий шаг, чтобы попытаться найти корень проблемы, - это то, на чем я застрял в данный момент!
У меня есть проект 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"
Это отлично строится и создает liblua.a в каталоге /src/. (Я запустил на нем nm, и он перечислил все прототипы функций, которые я ожидал). Я не знаю, могу ли я сделать что-нибудь еще, чтобы убедиться, что это действительно сборка для ARM?
NDKABI=8 означает, что я ориентируюсь на Android 2.2.
Настройка тестового проекта Android
Я создаю новый проект Android 2.2, используя эту команду:
android create project --target 3 --name test --path . --activity TestActivity --package com.test
Настройте 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, но я не уверен, как правильно его собрать или найти работающую готовую версию.