1

SSL をサポートする cURL をアプリにコンパイルしようとすると、問題が発生しました。

これまでのところ、openSSL パッケージを libcrypt.so と libssl.so にコンパイルすることに成功しました。

configure スクリプトを使用して、SSL をサポートするバージョンの libcurl.a を正常にコンパイルし、それを NDK にあるクロスチェーン コンパイラ (Linux 環境下) で実行することに成功したと思います。

現在、Android アプリの Java コードから呼び出すことができる .so ライブラリを Eclipse で作成しようとしています。

これまでのファイル構造は次のとおりです。

Project Folder ---> jni ---> include ---> curl ---> curl headers
                         |            |
                         |             -> openssl ---> ssl and crypto headers
                         |
                          -> libcrypto.so
                          -> libssl.so
                          -> libcurl.a
                          -> jniProcessRequest.c
                          -> Android.mk

Android.mk の読み取り:

LOCAL_PATH := $(call my-dir)
MY_PATH := $(LOCAL_PATH)
include $(CLEAR_VARS)
LOCAL_PATH := $(MY_PATH)

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

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

include $(CLEAR_VARS)
LOCAL_MODULE := curl
LOCAL_SRC_FILES := libcurl.a
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/curl/
include $(PREBUILT_STATIC_LIBRARY)

include $(CLEAR_VARS)
LOCAL_MODULE := JNIProcessRequest
LOCAL_SRC_FILES := JNIProcessRequest.c
LOCAL_SHARED_LIBRARIES := crypto ssl
LOCAL_STATIC_LIBRARIES := curl
LOCAL_LDLIBS := -llog

include $(BUILD_SHARED_LIBRARY)

jniProcessRequest.c:

#include <jni.h>
#include <stdlib.h>
#include "include/curl/curl.h"
#include <android/log.h>

JNIEXPORT void JNICALL Java_com_example_jniprocessrequest_MainActivity_jniProcessRequest(JNIEnv * env, jobject obje){
CURL *conn;
conn = curl_easy_init();
}

上記をコンパイルしようとするたびに、Eclipse で未定義の参照エラーが発生します。

make: *** [obj/local/armeabi/libJNIProcessRequest.so] Error 1
undefined reference to 'curl_easy_init'

これはある種のリンケージ エラーだと思いますが、エラーが発生している場所を見つけるのに苦労しています。共有ライブラリをさまざまな場所に配置するさまざまな方法をすべて試し、静的 libcurl を共有 libcurl に切り替え、Android.mk ファイルを変更し、Android で cURL を機能させる方法に関するチュートリアルに従って、ほぼ 2 日間を費やしました。

どんな助けでも大歓迎です!

4

2 に答える 2

0

curlビルド済みモジュールとして使用します。

include $(CLEAR_VARS)NDK のドキュメントに記載されているように、次のように (最も重要な)include $(PREBUILT_STATIC_LIBRARY)ディレクティブの下にラップするように注意する必要があります。

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)
LOCAL_MODULE := foo-prebuilt
LOCAL_SRC_FILES := libfoo.a
include $(PREBUILT_STATIC_LIBRARY)

JNIProcessRequestモジュールをinclude $(CLEAR_VARS)andでラップするように注意してくださいinclude $(BUILD_SHARED_LIBRARY)

詳細についてはdocs/PREBUILTS.html、Android NDK フォルダー内にあるセクションを参照してください (このように表示されます)。

于 2013-11-05T08:39:11.387 に答える