9

Android プロジェクトでオープン ソースの C ライブラリを使用しようとしています。このライブラリはatof()関数を使用します。atof()標準 C ライブラリ (stdlib.h) で定義されている関数であることはわかっています。そのため、Android NDK の標準 C ライブラリ (bionic ライブラリ) に実装する必要があります。

しかし、この関数の呼び出しを含むライブラリを読み込もうとすると、ランタイム エラーが発生します。

java.lang.UnsatisfiedLinkError: Cannot load library: reloc_library[1285]:    86 cannot locate 'atof'....

私は NDK を使用した Android 開発の初心者なので、フラグやコンパイラ ディレクティブなどを見落としている可能性があります。

私のandroid.mkファイルは次のとおりです。

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_ALLOW_UNDEFINED_SYMBOLS := true

LS_CPP=$(subst $(1)/,,$(wildcard $(1)/$(2)/*.c))


LOCAL_MODULE := libA

LOCAL_SHARED_LIBRARIES :=       \
                            libgmodule-2.0          \
                            libgobject-2.0          \
                            libgthread-2.0          \
                            libglib-2.0

LOCAL_SRC_FILES:= sourceFile.c



include $(BUILD_SHARED_LIBRARY
4

2 に答える 2

5

Google は、atof() などの C 標準ライブラリ関数の一部を、ヘッダー ファイル内のインライン関数から通常の関数に移動しました。最新の NDK はデフォルトで、デバイスの標準 C ライブラリ (libc.so) に atof() 関数を持つ最新の Android デバイスとのみ互換性のある .so をビルドします。これは、古いバージョンの C ライブラリを搭載した古いデバイスでライブラリを実行すると、予想される atof() 関数が存在しないため、dll のロード中にエラーが発生することを意味します。

Application.mk でこれを設定しようとしましたか:

APP_PLATFORM := android-9

これにより、ndk コンパイラは古い Android バージョンと互換性のあるコードをビルドします。

NDK のインストールをバージョン 10b にダウングレードすることもできます (このバージョンは、atof がインラインから libc の一部に移動された変更よりも前のものであるため、問題を完全に回避できます)。

于 2016-07-14T16:22:55.813 に答える
1

Android ソースの stdlib.hから;

static __inline__ double atof(const char *nptr)
{
    return (strtod(nptr, NULL));
}

atofつまり、ライブラリ関数ではなく、 を呼び出すインライン関数ですstrtod

ライブラリをロードして呼び出す必要がある場合は、strtod代わりに使用してください。

于 2013-01-28T21:29:45.877 に答える