256.Android Studio 引入libcurl

在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 <android/log.h> 日志将得到输出
	//这里我们关联了两个库 一个是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

 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Android libcurl.a是一个静态库,它是用C语言编写的libcurl网络传输库的编译结果。静态库是一种在编译时被链接到应用程序中的库,通过将库的对象代码直接嵌入到应用程序中,从而使应用程序可以在没有其他外部依赖项的情况下独立运行。 静态库的使用方式是将其与应用程序进行链接,这样应用程序就可以使用静态库中定义的函数和变量。在Android开发中,可以使用Android Studio等工具将libcurl.a添加到项目中,并在项目配置中进行链接设置。 使用Android libcurl.a静态库可以为Android应用程序提供强大而灵活的网络传输功能。libcurl库支持多种协议,包括HTTP、HTTPS、FTP等,并提供了一系列功能来方便地进行网络通信,例如数据传输、下载、上传等。通过使用libcurl库,Android应用程序可以方便地与网络资源进行交互,并实现各种功能,如下载文件、上传数据等。 静态库的一个优点是在编译时能够减少应用程序的体积,因为库的代码嵌入到应用程序中,不需要在运行时再次加载。同时,静态库的使用也可以提高应用程序的性能,因为库的代码可以被编译器优化,以达到更好的执行效率。 总之,Android libcurl.a静态库是一个有用的工具,可以为开发Android应用程序提供强大的网络传输功能,通过与应用程序进行链接,实现各种网络通信需求,同时也能减少应用程序的体积和提升性能。 ### 回答2: Android libcurl.a是一个静态库,它是Curl库在Android平台上的编译结果。Curl库是一个开源的网络传输工具,支持多种协议(包括HTTP、FTP、Telnet等)和一些常见的功能(如文件上传、下载等)。 libcurl.a的静态库形式可以将Curl库的功能和代码整合到一个独立的二进制文件中,这意味着在编译时会将Curl库中的函数和依赖项静态链接到应用程序中。 使用libcurl.a的静态库可以使开发者在编译阶段直接将Curl库的功能包含到应用程序中,不再需要运行时加载动态库文件。这样可以减少应用程序的体积并提升性能,但也意味着更新Curl库需要重新编译应用程序。 要在Android项目中使用libcurl.a,可以将静态库文件复制到项目的jni目录下,然后在JNI层的C/C++代码中引用该库。具体步骤包括在Android.mk中添加libcurl.a的编译指令,并在代码中使用#include导入相关的Curl库头文件。然后可以在应用程序中使用Curl库提供的功能,如发送HTTP请求等。 总之,Android libcurl.a是一个静态库,可以将Curl库的功能整合到Android应用程序中,帮助开发者在应用层面进行网络传输和其他网络相关操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值