3

我刚刚为 Android 编译了 OpenSSL。我有 libcrypto.so 和 libssl.so 共享库。我创建了一个名为 TrialApp 的示例 Android 应用程序。这个想法是使用一些可以调用 libssl 和 libcrypto 共享库的本机函数。因此,在我的 jni 目录下,我有一个 TrialApp.cpp,其中包含一个简单的 SHA1 示例。这是我在 Eclipse 上的 NDK 应用程序目录的树结构:

TrialApp
|
|-->Activity.java
|
|-->TrialApp.java(which includes System.LoadLibrary calls)
|
|-->jni
    |-->TrialApp.cpp
    |
    |-->Android.mk
    |
    |-->includes
    |   |
    |   |-->openssl (dir containing *.h files)
    |
    |-->precompiled
       |-->libssl.so
       |-->libcrypto.so

这是 Android.mk 文件

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE    := TrialApp
LOCAL_SRC_FILES := TrialApp.cpp
LOCAL_EXPORT_C_INCLUDE_DIRS  := $(LOCAL_PATH)/includes/openssl
LOCAL_LDLIBS := -llog
LOCAL_LDLIBS += $(LOCAL_PATH)/precompiled/libssl.so
LOCAL_LDLIBS += $(LOCAL_PATH)/precompiled/libcrypto.so
LOCAL_STATIC_LIBRARIES := sslx cryptox

include $(BUILD_SHARED_LIBRARY)

但是编译器找不到 TrialApp,.cpp 中的 openssl 头文件。

我得到的错误:致命错误:openssl/evp.h:没有这样的文件或目录

有人可以告诉我如何解决吗?谢谢。

4

1 回答 1

2

LOCAL_CFLAGS包含目录在编译器标志 -I: 中设置:因此,使用适当的键和标头位置设置变量,如下所示: LOCAL_CFLAGS += $(cf_includes)where cf_includesis defined like cf_includes:= includes/openssl+cf_includes := $(addprefix -Ijni/,$(cf_includes))
换句话说,您必须像这样破坏 LOCAL_CFLAGS :
LOCAL_CFLAGS += -Ijni/includes/openssl

尝试将您的 android.mk 替换为

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

c_includes := $(LOCAL_PATH) 
cf_includes:= includes/openssl

cf_includes := $(addprefix -Ijni/,$(cf_includes))

export_c_includes := $(c_includes)

LOCAL_MODULE    := TrialApp
LOCAL_SRC_FILES := TrialApp.cpp
LOCAL_CFLAGS    += $(cf_includes)
LOCAL_EXPORT_C_INCLUDES := $(export_c_includes)
LOCAL_LDLIBS := -llog
LOCAL_LDLIBS += $(LOCAL_PATH)/precompiled/libssl.so
LOCAL_LDLIBS += $(LOCAL_PATH)/precompiled/libcrypto.so
LOCAL_STATIC_LIBRARIES := sslx cryptox

include $(BUILD_SHARED_LIBRARY)


希望能帮助到你

于 2013-06-24T10:19:57.327 回答