在Android上部署libcurl.a
1 将对应平台的 libcurl.a 放在JNI文件夹中。 还有curl/整个文件夹(.h头文件) 也放在JNI路径,拷贝适合自己手机的libcurl.a文件到jni目录下,比如手机是arm的虚拟机是x86的
2.这个时候需要将新增加的libcurl.so也编译生成,将jni生成的so文件 一起联通libcurl.a一起编译,需要修改Android.mk文件,新增加的代码如下:
include $(CLEAR_VARS)
# libcurl.a
LOCAL_MODULE := libcurl
LOCAL_SRC_FILES := libcurl.a
include $(PREBUILT_STATIC_LIBRARY)
也需要新增加,因为需要依赖到新生成的libcurl
LOCAL_STATIC_LIBRARIES := libcurl
修改以后的Android.mk文件如下:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
# libcurl.a
LOCAL_MODULE := libcurl
LOCAL_SRC_FILES := libcurl.a
include $(PREBUILT_STATIC_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := FunUtils
LOCAL_SRC_FILES := FunUtils.cpp login.cpp cJSON.CPP
LOCAL_LDLIBS := -llog -lz
LOCAL_STATIC_LIBRARIES := libcurl
include $(BUILD_SHARED_LIBRARY)
3 修改AndroidStudio配置文件,在项目/app/build.gradle,在defaultConfig {}下面增加下面的文件
// 不声明ndk标签,项目默认会创建一个libapp.so的文件
ndk {
// 声明创建so库的文件名,会自动添加lib前缀, 添加了前缀,不会自动添加
moduleName "FunUtils"
//声明启用Android日志, 在c/c++的源文件中使用的#include 日志将得到输出
//这里我们关联了两个库 一个是liblog 和 libz
ldLibs "log","z"
// 声明创建指定cpu架构的so库, 不声明的话, 默认(gradle 1.5.0)会生成7中架构,如果你的libcurl没有提供别的平台,那么就会链接失败,
//所以此条配置很重要,这里我们只生成一个平台
abiFilters "armeabi"
}
截图如下:
也需要修改Android.mk文件,新增一个依赖so“-lz”
LOCAL_LDLIBS := -llog -lz
修改后的Android,mk如下:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
# libcurl.a
LOCAL_MODULE := libcurl
LOCAL_SRC_FILES := libcurl.a
include $(PREBUILT_STATIC_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := FunUtils
LOCAL_SRC_FILES := FunUtils.cpp login.cpp cJSON.CPP
LOCAL_LDLIBS := -llog -lz
include $(BUILD_SHARED_LIBRARY)
4 在JNI路径下 添加Application.mk文件
在文件中添加如下代码 表示当前ndk_build 过滤平台结果,这样就只编译arm平台下面的
APP_ABI = armeabi
如果是all那就所有的都编译,生成一堆文件
APP_ABI := all
5 在login.cpp中添加#include "curl/curl.h",在login的jni接口中随便调用curl代码
CURL* curl = curl_easy_init();
点击SYnc Now
6 ndk_build.cmd 重新生成so文件 看是否能够编译成功
7 部署在app手机上,点击一下登陆按钮。如果app不崩溃 环境通了。
安装的时候可能的错误提示:
1.安装过程中遇到了下面的错误,是因为之前都是设置的armeabi,将所有的Anrdoid.mk,/app/build.gradle,,Application.mk引入的so都换成“armeabi-v7a”问题解决:
D:\Code\Code_for_androideclipse2019\01hello\app\src\main\jni>ndk-build.cmd
Android NDK: APP_PLATFORM not set. Defaulting to minimum supported version android-16.
Android NDK: WARNING: APP_PLATFORM android-16 is higher than android:minSdkVersion 1 in D:/Code/Code_for_androideclipse2019/01hello/app/src/main/AndroidManifest.xml. NDK binaries will
*not* be compatible with devices older than android-16. See https://android.googlesource.com/platform/ndk/+/master/docs/user/common_problems.md for more information.
Android NDK: The armeabi ABI is no longer supported. Use armeabi-v7a.
Android NDK: NDK Application 'local' targets unknown ABI(s): armeabi
Android NDK: Please fix the APP_ABI definition in D:/Code/Code_for_androideclipse2019/01hello/app/src/main/jni/Application.mk
C:/Users/Administrator/AppData/Local/Android/Sdk/ndk-bundle/build//../build/core/setup-app.mk:79: *** Android NDK: Aborting . Stop.
截图如下:
APP_ABI := armeabi-v7a
2.ndk-build.cmd成功但是启动app失败,是因为虚拟机的是X86需要将所有的信息修改成X86的进行编译才行
错误提示如下:
2019-10-16 07:29:53.358 1640-1640/? D/AndroidRuntime: >>>>>> START com.android.internal.os.RuntimeInit uid 0 <<<<<<
2019-10-16 07:29:53.360 1640-1640/? D/AndroidRuntime: CheckJNI is OFF
2019-10-16 07:29:53.386 1640-1640/? W/art: Unexpected CPU variant for X86 using defaults: x86
2019-10-16 07:29:53.389 1640-1640/? D/ICU: No timezone override file found: /data/misc/zoneinfo/current/icu/icu_tzdata.dat
2019-10-16 07:29:53.406 1640-1640/? E/memtrack: Couldn't load memtrack module (No such file or directory)
2019-10-16 07:29:53.407 1640-1640/? E/android.os.Debug: failed to load memtrack module: -2
2019-10-16 07:29:53.408 1640-1640/? I/Radio-JNI: register_android_hardware_Radio DONE
2019-10-16 07:29:53.417 1640-1640/? D/AndroidRuntime: Calling main entry com.android.commands.am.Am
--------- beginning of system
2019-10-16 07:29:53.420 522-736/system_process I/ActivityManager: Force stopping com.ldw.hello appid=10063 user=0: from pid 1640
截图如下:
APP_ABI := x86