4

私はAndroid、コンパイル、およびリンク全般に非常に慣れていません。私の問題ではどの詳細が重要なのかわかりませんので、すべてをお伝えします。変なところや間違っているところがあれば教えてください。

Android-NDK で libcrypto.so および libssl.so ライブラリをビルドしました。openssl.so の関数を使用するネイティブ コードを作成しました (openssl.so は libssl.so の関数を使用します)。コードはコンパイルされますが、リンク時に「未定義の参照」エラーが発生します。

./obj/local/armeabi/objs/pki_send/pki_send.o: In function `main':
/home/android/nativeserver/jni/pki_send.c:27: undefined reference to `RSA_generate_key'
collect2: ld returned 1 exit status
make: *** [obj/local/armeabi/pki_send] Error 1

私はGoogleで検索し、私と同じ問題を抱えている人を見つけまし. 私の問題に関連する彼女の投稿の一部を引用します。

[「未定義の参照」を引き起こす関数への]引数を削除すると、コンパイラは引数が少なすぎると言い、引数を追加するとコンパイラは引数が多すぎると言うので、「何らかの」種類があるようです正しい関数への参照。おそらく間違ってリンクが行われていますか?

これと同じ動作に気付きました。彼女は、openssl ライブラリを使用するようにコンパイラに指示する -lssl 設定でコンパイルすることで、問題を解決しました。これを行うために、Android.mk ファイルのモジュールを次のように変更しました。

LOCAL_LDLIBS += -ldl

これに:

LOCAL_LDLIBS += -lssl -lcrypto -ldl 

libssl は libcrypto に依存しているため、安全のために -lcrypto を含めました。ndk-build を実行すると、次のエラーが表示されます。

/home/android/android-ndk-r8/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/../lib/gcc/arm-linux-androideabi/4.4.3/../../../../arm-linux-androideabi/bin/ld: cannot find -lssl
collect2: ld returned 1 exit status
make: *** [obj/local/armeabi/pki_send] Error 1

このエラーは、「ld」が libssl.so を見つけられないことを示しています。jni ディレクトリに libcrypto.so と libssl.so の両方があります。jni ディレクトリを「ld」の検索パスに追加する方法を見つけたかったのですが、これがわかりませんでした。libssl.so と libcrypto.so を次のディレクトリに追加して、この問題を解決しようとしました: /android-ndk-r8/platforms/android-8/arch-arm/usr/lib (「ld」がここで検索すると思いますライブラリ)。これを行ったら、ndk-build を再度実行し、「未定義の参照」エラーを受け取りました。

./obj/local/armeabi/objs/pki_send/pki_send.o: In function `main':
/home/android/nativeserver/jni/pki_send.c:27: undefined reference to `RSA_generate_key'
collect2: ld returned 1 exit status
make: *** [obj/local/armeabi/pki_send] Error 1

ここから先、どう進めばいいのか分からなくなります。

念のため、Android.mk ファイルのコードを次に示します。

LOCAL_PATH := $(call my-dir)
APP_PLATFORM := android-8

include $(CLEAR_VARS)

LOCAL_MODULE    := crypto 
LOCAL_SRC_FILES := libcrypto.so 
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/../include/

include $(PREBUILT_SHARED_LIBRARY)

include $(CLEAR_VARS)

LOCAL_MODULE    := ssl 
LOCAL_SRC_FILES := libssl.so 
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/../include/

include $(PREBUILT_SHARED_LIBRARY)

include $(CLEAR_VARS)

LOCAL_SRC_FILES := pki_send.c 
LOCAL_MODULE    := pki_send 
LOCAL_SHARED_LIBRARIES := ssl crypto 
LOCAL_LDLIBS += -lssl -lcrypto -ldl

LOCAL_MODULE_TAGS := optional

include $(BUILD_EXECUTABLE)

編集: 追加するのを忘れていたもの: libcrypto.so のネイティブ コードで関数を使用すると、コードは正常にコンパイルおよびリンクされます。libcrypto.so ではどの関数も使えるようです。ただし、問題を引き起こす機能はlibssl.soにあります。これは重要かもしれませんし、そうでないかもしれません。

4

1 に答える 1

8

問題を解決しました。私が呼び出していた関数「RSA_generate_key」は、非推奨バージョンの libcrypto.so にのみ存在します。「RSA_generate_key_ex」を使用する新しいバージョンを使用していました。libcrypto.so で readelf を実行して、これを見つけました。

$ ./arm-linux-androideabi-readelf -all ~/nativeserver/jni/libcrypto.so |grep RSA_generate
   679: 00089239   992 FUNC    GLOBAL DEFAULT    7 RSA_generate_key_ex
 10334: 00089239   992 FUNC    GLOBAL DEFAULT    7 RSA_generate_key_ex

プログラムがまだコンパイルされている理由は、ライブラリにはありませんが、RSA_generate_key が openssl/rsa.h のヘッダー ファイルにあるためです。

于 2012-07-28T03:22:11.363 に答える