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为啥不行???

posted @ 2023-09-23 22:45  小驰行动派  阅读(112)  评论(0编辑  收藏  举报  来源