Android 12,调用系统库libft2.so 遇到的各种问题记录
问题前提,Android 12系统,vendor静态库中调用 libft2.so。(vendor静态库中调用libft2.so会简单点,没这么麻烦)
【问题1】
(native:vendor) can not link against libft2 (native:platform)
本地debug尝试修改:
为了本地环境debug调试方便,我找了个 mk文件,在里面添加了引用libft2.so
/vendor/qcom/proprietary/chi-cdk/test/chifeature2testframework/common/build/android/Android.mk
然后通过make libchifeature2testframework -j8 来验证,是否能成功引用libft2.so
网络上找了很多资料,也尝试了很多的方法,不过都没效果。
一、prebuild目录下相关内容修改
1)ld.config.29.txt 相关内容修改
find -name ld.config.29.txt
/prebuilts/vndk/v29/arm64/configs$ git status ./
修改: ld.config.29.txt
修改: vndkprivate.libraries.29.txt
这边的namespace里面,把libft2.so都给加上。
2)vndkprivate.libraries.29.txt 修改内容
2、build目录下相关内容修改
二、自己摸索
external/freetype/Android.mp 内容修改。
在第7行的位置,添加了vendor_available: true
build/make/core/base_rules.mk:339: error: external/freetype: MODULE.TARGET.SHARED_LIBRARIES.libft2.vendor already defined by external/freetype
有上面报错,原因是,vendor_available已经有地方定义了。
===================================================================
问题(native:vendor) can not link against libft2 (native:platform) 真正的解决方法:
proprietary:true
如下图所示,在freetype的Android.bp里面,第6行的位置,添加上proprietary:true。
三、libft2.so内容调用验证
前面的编译终于没有问题。在out目录下也生成了对应的文件。(静态库生成的是.a后缀的文件,动态库生成的是.so后缀的文件)。
libft2库是编译出来了,然后我又想要验证下,代码里面调用libft2内容有没有问题呢?然后我网上找了下相关调用,简单加了下调用代码。
--- a/vendor/qcom/proprietary/chi-cdk/test/chifeature2testframework/feature2testcase.cpp
+++ b/vendor/qcom/proprietary/chi-cdk/test/chifeature2testframework/feature2testcase.cpp
@@ -16,8 +16,12 @@
#include "chistatsproperty.h"
#include "metaconfigparser.h"
#include "streamconfigparser.h"
-
#include <string>
+#include <ft2build.h>
+#include FT_CONFIG_CONFIG_H
+#include FT_TYPES_H
+#include FT_ERRORS_H
+#include FT_FREETYPE_H
// Initialize static variables
UINT32 Feature2TestCase::m_frameNumber;
@@ -187,6 +191,25 @@ CDKResult Feature2TestCase::SetupCamera()
}
}
+ //for test
+ FT_Library library;
+ if (FT_Init_FreeType(&library))
+ {
+ return CDKResultSuccess;
+ }
+
+ // The Object In Which FreeType Holds Information On A Given
+ // Font Is Called A "face".
+ FT_Face face;
+
+ // This Is Where We Load In The Font Information From The File.
+ // Of All The Places Where The Code Might Die, This Is The Most Likely,
+ // As FT_New_Face Will Fail If The Font File Does Not Exist Or Is Somehow Broken.
+ if (FT_New_Face(library, "arial.TTF", 0, &face))
+ {
+ return CDKResultSuccess;
+ }
+
CF2_LOG_EXIT();
这里一定得注意,下面这些#include 一定得加上,不然也是没法调用到 FT_Face等内容的。
error: unknown type name 'FT_Library'
error: unknown type name 'FT_Face'
#include FT_CONFIG_CONFIG_H
#include FT_TYPES_H
#include FT_ERRORS_H
#include FT_FREETYPE_H
四、vendor动态库中调用libft2.so
vendor 动态库中调用libft2.so,需要修改是的freetype/Android.bp中如下的地方。
在llndk_library中添加 vendor_available: true
疑问:
1)vendor静态库中,动态引用libft2.so为啥不行???