256.Android Studio 引入libcurl

本文详细介绍了在Android项目中部署libcurl库的具体步骤,包括放置libcurl.a文件、修改Android.mk文件、添加依赖、配置ABI及编译生成so文件。

在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

 

你说的这一行: ``` lrwxrwxrwx 1 root root 16 Oct 1 10:00 /usr/local/lib/libcurl.so.4 -> libcurl.so.4.8.0 ``` 说明你已经正确地在 `/usr/local/lib` 下安装了 `libcurl`,并且它指向了 `libcurl.so.4.8.0`,这是 `libcurl` 的一个旧版本(可能是 7.85.0,因为 `libcurl.so.4.8.0` 通常对应 curl 7.85.0)。 而你期望的是: ``` libcurl.so.4 -> libcurl.so.8.15.0 ``` 这表示你希望使用的是 **libcurl 8.15.0**,但你当前系统里安装的仍然是 **7.85.0**(或类似旧版本)。 --- ## ✅ 问题定位 你可能已经执行过: ```bash ./configure --prefix=/usr/local --enable-shared make sudo make install ``` 但你编译安装的其实是 **curl 7.x**(比如 7.85.0),而不是 **8.15.0**。 --- ## 🧩 第一步:确认你下载的是 `curl-8.15.0.tar.gz` 请运行: ```bash ls -l /tmp/curl-8.15.0.tar.gz ``` 如果你看到: ``` -rw-r--r-- 1 root root 2950148 Oct 1 09:30 /tmp/curl-8.15.0.tar.gz ``` 说明你有正确的压缩包。 否则,你需要重新下载: ```bash cd /tmp curl -O https://curl.se/download/curl-8.15.0.tar.gz tar -zxvf curl-8.15.0.tar.gz cd curl-8.15.0 ``` --- ## 🧩 第二步:重新编译并安装到 `/usr/local` ```bash ./configure --prefix=/usr/local --enable-shared make clean make sudo make install sudo ldconfig ``` --- ## 🧩 第三步:验证新版本是否安装成功 ```bash /usr/local/bin/curl -V ``` 你应该看到: ``` curl 8.15.0 ... ``` 如果没有,请检查你的 PATH: ```bash which curl ``` 如果输出 `/usr/bin/curl`,说明你调用的是系统默认的旧版 curl。 你可以临时使用: ```bash export PATH=/usr/local/bin:$PATH ``` 然后再次运行: ```bash curl -V ``` --- ## 🧩 第四步:更新软链接 `/usr/local/lib/libcurl.so.4` 现在我们手动删除旧链接并重新创建指向 `libcurl.so.8.15.0` 的链接。 ### ✅ 查看当前 libcurl 文件: ```bash ls -l /usr/local/lib/libcurl* ``` 你会看到类似: ``` lrwxrwxrwx 1 root root 16 Oct 1 10:00 libcurl.so.4 -> libcurl.so.4.8.0 -rwxr-xr-x 1 root root ... libcurl.so.4.8.0 -rwxr-xr-x 1 root root ... libcurl.so.8.15.0 ``` ### ✅ 删除旧链接并创建新链接: ```bash cd /usr/local/lib sudo rm libcurl.so.4 sudo ln -s libcurl.so.8.15.0 libcurl.so.4 sudo ldconfig ``` --- ## 🧩 第五步:验证 PHP 使用的是新版 libcurl ```bash ldd /opt/cpanel/ea-php84/root/usr/lib64/php/modules/curl.so | grep libcurl ``` 你应该看到: ``` libcurl.so.4 => /usr/local/lib/libcurl.so.4 (0x00007f...) ``` --- ## 🧩 第六步:重启 PHP-FPM 并验证 PHP 输出 ```bash /scripts/restartsrv_apache_php_fpm php -i | grep 'libcurl' ``` 你应该看到: ``` libcurl => enabled libcurl version => 8.15.0 ``` --- ## ✅ 总结流程图 | 步骤 | 操作 | 验证命令 | |------|------|----------| | 1 | 下载 `curl-8.15.0.tar.gz` | `ls -l` | | 2 | 编译安装到 `/usr/local` | `./configure && make && make install` | | 3 | 更新软链接 `libcurl.so.4` | `ln -s libcurl.so.8.15.0 libcurl.so.4` | | 4 | 更新动态库缓存 | `ldconfig` | | 5 | 验证 PHP 是否使用新版 | `ldd curl.so \| grep libcurl` | | 6 | 重启 PHP-FPM 并验证 PHP 输出 | `php -i \| grep 'libcurl'` | --- ##
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值