iOS 同时支持 armv7 和 arm64 的 webRTC 库
iOS webRTC library supporting both armv7 & arm64
如何在 iOS 中获得同时支持 armv7 和 arm64 的 webRTC 库?
你很幸运。我刚刚完成将 webrtc 集成到我的项目中几天。我的解决方案如下:
将您为 armv7 构建的所有 *.a 合并到 libWebRTC-armv7.a:使用命令行如下
libtool -static -o src/out_ios_armv7/Release-iphoneos/libWebRTC-temp.a src/out_ios_armv7/Release-iphoneos/*.a
strip -S -x -o src/out_ios_armv7/Release-iphoneos/libWebRTC-armv7.a -r src/out_ios_armv7/Release-iphoneos/libWebRTC-temp.a
将您为 arm64 构建的所有 *.a 合并到 libWebRTC-arm64.a:
libtool -static -o src/out_ios/Release-iphoneos/libWebRTC-temp.a src/out_ios/Release-iphoneos/*.a
strip -S -x -o src/out_ios/Release-iphoneos/libWebRTC-arm64.a -r src/out_ios/Release-iphoneos/libWebRTC-temp.a
创建同时支持 armv7 和 arm64 的 libWebRTC:
lipo -create src/out_ios_armv7/Release-iphoneos/libWebRTC-armv7.a src/out_ios/Release-iphoneos/libWebRTC-arm64.a -output libWebRTC.a
P.s:只需将您的 armv7 库构建到与 arm64 分隔的文件夹中即可:
export GYP_GENERATORS="ninja"
export GYP_DEFINES="build_with_libjingle=1 build_with_chromium=0 libjingle_objc=1 OS=ios target_arch=armv7"
export GYP_GENERATOR_FLAGS="$GYP_GENERATOR_FLAGS output_dir=out_ios_armv7"
export GYP_CROSSCOMPILE=1
pushd src
gclient runhooks
ninja -C out_ios_armv7/Release-iphoneos AppRTCDemo
popd
您可以参考我们的博客:
我写了一个 shell 脚本来将 WebRTC 源构建到一个框架(不包括 apprtc 信令库)以供 iOS 使用。
如果你看不懂中文,你只要看那个博客里的脚本就够了!啊哈
./build_webrtc.sh build_all
armv7 设备可能存在错误。该错误是由 armv7 neon 函数中的 VP8 解码中的堆栈溢出问题引起的。
您可以确认此补丁修复了它的崩溃问题:
diff --git a/source/libvpx/vp8/common/arm/neon/vp8_subpixelvariance_neon.c b/source/libvpx/vp8/common/arm/neon/vp8_subpixelvariance_neon.c
index 8308d55..a66b6f5 100644
--- a/source/libvpx/vp8/common/arm/neon/vp8_subpixelvariance_neon.c
+++ b/source/libvpx/vp8/common/arm/neon/vp8_subpixelvariance_neon.c
@@ -1003,7 +1003,7 @@ unsigned int vp8_sub_pixel_variance8x8_neon(
const unsigned char *dst,
int dst_stride,
unsigned int *sse) {
- DECLARE_ALIGNED_ARRAY(kAlign16, uint8_t, temp2, kHeight8 * kWidth8);
+ DECLARE_ALIGNED_ARRAY(kAlign16, uint8_t, temp2, kHeight8PlusOne * kWidth8);
DECLARE_ALIGNED_ARRAY(kAlign16, uint8_t, fdata3, kHeight8PlusOne * kWidth8);
if (xoffset == 0) {
var_filter_block2d_bil_w8(src, temp2, src_stride, kWidth8, kHeight8,
希望对您有所帮助!
diveinedu.com的同学刚刚克服并修复了这个bug。
感谢 phuongle,这确实有效...
...但有一个转折...
...正如 Omer Waqas Khan 所注意到的,在某些情况下可能会遇到错误消息(在 lipo-ing 时):both libs can't be of同样的结构.
当然,我去了 WTF...lipo,你怎么了...它们的结构不同...我是这样建造的...
但后来我开始仔细检查它:
- 我进入了我有 arm64_merged 库的文件夹和...
lipo -info lib's_name.a
它报告了同时是 armv7 和 arm64 类型。不解,我于是...
lipo -info *.a
...所有库(其中 72 个)都报告为 arm64 类型,除了 2...
libisac_fix.a
libisac_neon.a
无论出于何种原因,它们都是 armv7。
当天早些时候,我正在使用 webrtc thingy 的 "a few days old" 克隆。那时,我记得总是只获得 70 个库。但是后来,出于其他原因,我决定
gclient sync
在那之后,我得到了 72...因此,我只是删除了 libisac 废话。现在2个fat_libs是不同的类型,我可以成功吸脂
如何在 iOS 中获得同时支持 armv7 和 arm64 的 webRTC 库?
你很幸运。我刚刚完成将 webrtc 集成到我的项目中几天。我的解决方案如下:
将您为 armv7 构建的所有 *.a 合并到 libWebRTC-armv7.a:使用命令行如下
libtool -static -o src/out_ios_armv7/Release-iphoneos/libWebRTC-temp.a src/out_ios_armv7/Release-iphoneos/*.a
strip -S -x -o src/out_ios_armv7/Release-iphoneos/libWebRTC-armv7.a -r src/out_ios_armv7/Release-iphoneos/libWebRTC-temp.a
将您为 arm64 构建的所有 *.a 合并到 libWebRTC-arm64.a:
libtool -static -o src/out_ios/Release-iphoneos/libWebRTC-temp.a src/out_ios/Release-iphoneos/*.a
strip -S -x -o src/out_ios/Release-iphoneos/libWebRTC-arm64.a -r src/out_ios/Release-iphoneos/libWebRTC-temp.a
创建同时支持 armv7 和 arm64 的 libWebRTC:
lipo -create src/out_ios_armv7/Release-iphoneos/libWebRTC-armv7.a src/out_ios/Release-iphoneos/libWebRTC-arm64.a -output libWebRTC.a
P.s:只需将您的 armv7 库构建到与 arm64 分隔的文件夹中即可:
export GYP_GENERATORS="ninja"
export GYP_DEFINES="build_with_libjingle=1 build_with_chromium=0 libjingle_objc=1 OS=ios target_arch=armv7"
export GYP_GENERATOR_FLAGS="$GYP_GENERATOR_FLAGS output_dir=out_ios_armv7"
export GYP_CROSSCOMPILE=1
pushd src
gclient runhooks
ninja -C out_ios_armv7/Release-iphoneos AppRTCDemo
popd
您可以参考我们的博客:
我写了一个 shell 脚本来将 WebRTC 源构建到一个框架(不包括 apprtc 信令库)以供 iOS 使用。
如果你看不懂中文,你只要看那个博客里的脚本就够了!啊哈
./build_webrtc.sh build_all
armv7 设备可能存在错误。该错误是由 armv7 neon 函数中的 VP8 解码中的堆栈溢出问题引起的。
您可以确认此补丁修复了它的崩溃问题:
diff --git a/source/libvpx/vp8/common/arm/neon/vp8_subpixelvariance_neon.c b/source/libvpx/vp8/common/arm/neon/vp8_subpixelvariance_neon.c
index 8308d55..a66b6f5 100644
--- a/source/libvpx/vp8/common/arm/neon/vp8_subpixelvariance_neon.c
+++ b/source/libvpx/vp8/common/arm/neon/vp8_subpixelvariance_neon.c
@@ -1003,7 +1003,7 @@ unsigned int vp8_sub_pixel_variance8x8_neon(
const unsigned char *dst,
int dst_stride,
unsigned int *sse) {
- DECLARE_ALIGNED_ARRAY(kAlign16, uint8_t, temp2, kHeight8 * kWidth8);
+ DECLARE_ALIGNED_ARRAY(kAlign16, uint8_t, temp2, kHeight8PlusOne * kWidth8);
DECLARE_ALIGNED_ARRAY(kAlign16, uint8_t, fdata3, kHeight8PlusOne * kWidth8);
if (xoffset == 0) {
var_filter_block2d_bil_w8(src, temp2, src_stride, kWidth8, kHeight8,
希望对您有所帮助!
diveinedu.com的同学刚刚克服并修复了这个bug。
感谢 phuongle,这确实有效...
...但有一个转折...
...正如 Omer Waqas Khan 所注意到的,在某些情况下可能会遇到错误消息(在 lipo-ing 时):both libs can't be of同样的结构.
当然,我去了 WTF...lipo,你怎么了...它们的结构不同...我是这样建造的...
但后来我开始仔细检查它:
- 我进入了我有 arm64_merged 库的文件夹和...
lipo -info lib's_name.a
它报告了同时是 armv7 和 arm64 类型。不解,我于是...
lipo -info *.a
...所有库(其中 72 个)都报告为 arm64 类型,除了 2...
libisac_fix.a
libisac_neon.a
无论出于何种原因,它们都是 armv7。 当天早些时候,我正在使用 webrtc thingy 的 "a few days old" 克隆。那时,我记得总是只获得 70 个库。但是后来,出于其他原因,我决定
gclient sync
在那之后,我得到了 72...因此,我只是删除了 libisac 废话。现在2个fat_libs是不同的类型,我可以成功吸脂