私は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にあります。これは重要かもしれませんし、そうでないかもしれません。