次のような状況があります。AES 暗号化に OpenSSL を使用してアプリの一部を移植しています。すべてをコンパイルしましたが、リンカーが失敗します。状況は次のとおりです。 1.単純に次のことを行う JNI ラッパーを作成しました。
private native String cipherString(String plainData, int datasize, String password, int passSize);
private native String decipherString(String cipheredData, int datasize, String password, int passSize);
次に、jstring を char * に変換し、その他すべての必要な変換を行う適切な JNI シンタックスを持つ c++ ファイルを呼び出し、実際に openssl ヘッダー (存在し、説明されている) をインポートし、openssl メソッドを呼び出す別の cpp ファイルを呼び出します。暗号化と解読用。
したがって、ndk-build を呼び出すと、すべてのサムがビルドされるため、コンパイラはそれらを正しくコンパイルします。次に、Android用にopensslを移植する必要があり、このOpenSSL for Android を使用しました。これは、単純なndk-build(もちろんプロジェクトのルートにあります)でcharのように機能し、libssl.soとlibcrypto.soをビルドします
だから私は2つを接続する必要があります..ビルドスクリプトを接続するのは難しいと思います.1つのndk-buildがすべてをコンパイルしてリンクします(時間があれば簡単なサンプルプロジェクトをいただければ幸いです)
そのため、コンパイル済みの libssl および libcrypto .so ファイルを jni/includes/prebuilt にコピーし、それらをプロジェクトに含めて、リンカーが最後に使用する lib を最終的に作成できるようにします。
次の Android.mk ファイルがあります
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
include $(LOCAL_PATH)/includes/build/common.mk
include $(LOCAL_PATH)/includes/build/common_includes.mk
APP_STL := gnustl_static
LOCAL_MODULE := packer
LOCAL_SRC_FILES := modules/cipher/wrapper.cpp \
... #rest of the cpp code
LOCAL_C_INCLUDES += $(LOCAL_PATH)/includes/openssl
LOCAL_SHARED_LIBRARIES := $(LOCAL_PATH)/includes/precompiled/libssl.so \
$(LOCAL_PATH)/includes/precompiled/libcrypto.so
LOCAL_SHARED_MODULES := sslx cryptox
include $(BUILD_SHARED_LIBRARY)
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := sslx
LOCAL_SRC_FILES := $(LOCAL_PATH)/includes/precompiled/libssh.so
include $(PREBUILT_SHARED_LIBRARY)
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := cryptox
LOCAL_SRC_FILES := $(LOCAL_PATH)/includes/precompiled/libssh.so
include $(PREBUILT_SHARED_LIBRARY)
そして ndk-build を呼び出すと、がっかりします
sslx: LOCAL_SRC_FILES points to a missing file. Check that /home/user/Development/Tools/sdk/android/ndk/build/core//home/user/Development/Tools/sdk/android/ndk/build/core/includes/precompiled/libssh.so exists or that its path is correct. Aborting . Stop.
パスが完全に間違っているとすでに推測できるので、混乱しているのは、 ${LOCAL_PATH} がインクルードの最初のバッチに対して正しいパスを返し、.so ファイルに対して完全に間違ったパスを返すことです...どんな助けも本当に感謝しています!