1

私はAndroidアプリケーションを作成しました。ここでは、ほとんどのコードがcにあるため、jniを使用して作成しました。socket.soを使用する必要があるファイルを作成する必要がありlibtest.soます。

libtest.soinsocket.soを使用しているときにerror:undefined reference to function()。私のfunction()は。の中にありlibtest.soます。提案によってこれを熱望するために、私は以下のように私のAndroid.mkを作成しました:

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)
LOCAL_MODULE := libtest
LOCAL_SRC_FILES := libtest.so
include $(PREBUILT_SHARED_LIBRARY)

include $(CLEAR_VARS)
LOCAL_MODULE := socket
LOCAL_SHARED_LIBRARIES += libtest
LOCAL_SRC_FILES := source/interface.c source/file.c
LOCAL_LDFLAGS += libtest.a  
LOCAL_C_INCLUDES := $(LOCAL_PATH)/../../libtest/jni/include
include $(BUILD_SHARED_LIBRARY)

libtest.soただし、 &libtest.aファイルの両方が存在する必要があります。まるでそれだけを使っているかのように、libtest.aそれは完全にうまく機能します。

私の要件はlibtest.soを作成し、それをsocket.soに含めることなので、.aファイルの依存関係を回避して.soファイルを作成する方法を教えてください。

コメントする場合LOCAL_LDFLAGS += libtest.a は、error:undefined reference to function()

いずれか1つのplzは私がこの問題から抜け出すのを助けます.......

4

2 に答える 2

1

少し汚れているようです。

共有ライブラリ(.so)とアーカイブ(.a)はどちらも同じコードを含むはずですが、実際には含まれていない可能性があります。最初にすべきことは、.soに本当にすべての記号があるかどうかを確認することです。リンカが最適化した可能性があります。nmユーティリティを使用するかobjdump、その目的で使用してください。

ndk-buildが実行しているコマンドのコンソールダンプを投稿することもできますか?

NDKは、相互に依存する共有ライブラリを作成することを実際には意図していないため、実行していることを避けようとする場合もあります。もちろん可能ですが、推奨されるアプローチは、ライブラリを静的アーカイブに詰め込み、結果のJNI.soに直接リンクすることです。

編集:

LOCAL_SRC_FILES := libtest.so間違っているようです。共有ライブラリとリンクする場合は、ライブラリをコンパイラではなくリンカに渡します。LOCAL_LDFLAGS += libtest.soまたは、さらに良いことに、LOCAL_LDFLAGS += -L. -ltest

于 2012-07-27T10:58:10.383 に答える
0

@onitakeに感謝します。

ここでの単純な間違いは、libtest.soが適切ではなかったということでした(バグのあるコードによって作成されました)。

次に、適切なlibtest.soを作成したら、

ノート:

誰かが適切な.soファイルを持っていて、それでもエラーが発生する場合は、リンクエラーが発生している可能性があります。したがって、jstは次の行を削除します。

LOCAL_C_INCLUDES := $(LOCAL_PATH)/../../libtest/jni/include

そして、置きます

LOCAL_EXPORT_C_INCLUDES:= $(LOCAL_PATH)/../../libtest/jni/include 

上記のステートメントはどちらも同じですが、うまくいく場合もあります。

于 2012-10-03T12:14:03.013 に答える