私は昨日のほとんどをこれと格闘してうまくいかなかったと思います。問題の根本を見つけようとする次のステップでさえ、私は今のところ立ち往生しています!
ビルド済みの LuaJIT スタティック ライブラリを参照しようとしている Android 2.2 プロジェクトがありますが、ndk-build で次のエラーが表示されます。
test_android.cpp:25: undefined reference to `luaL_newstate'
LuaJIT を liblua.a としてビルドし、それを関連するヘッダーと共に JNI ディレクトリのルートに配置しました。以下に示すように、Android.mkが1つあります。
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();
}
これはリンカ エラーのようです。何らかの理由でスタティック ライブラリ ファイルが正しく参照されていません。しかし、私には、メイクファイルは正しいようです。
どんな助けでも大歓迎です!
- まず、すべてがどのようにリンクされているか、共有ライブラリ モジュールが実際に静的ライブラリにアクセスできるかどうかを確認する方法はありますか?
追加情報
関連する可能性があると思われる追加情報を次に示します。
ライブラリの構築
多分それは正しくない静的libファイルですか?(ビルド済みのものをダウンロードして確認できる場所はありますか?)。このスクリプトで作成しました(LuaJIT Webサイトから)。最新の安定した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
私が周りを検索して見た問題のほとんどは、ローカルライブラリのインクルード順序が原因です.1つのライブラリしか持っていないため、これは問題ではなく、より根本的な問題を解決できたことを示唆しています:)
アップデート
それ以来、通常の Lua をビルドし、それをビルド済みの静的ライブラリとして追加しましたが、正常に動作します。LuaJIT をどのようにビルドしたかが疑わしいのですが、それを正しくビルドする方法や、動作するビルド済みバージョンを見つける方法がわかりません。