benjaminwan / ChineseTtsTflite

Android Chinese TTS Engine Base On Tensorflow TTS , use for TfLite Models Test。安卓离线中文TTS引擎,在TensorflowTTS基础上开发,用于TfLite模型测试。
Apache License 2.0
316 stars 46 forks source link

如何直接使用编译好的so库? #4

Closed watersoft123 closed 2 years ago

watersoft123 commented 2 years ago

你好!我想直接使用编译好的so库,不用在gradle里使用implementation,这个如何操作?我按照网上介绍的方法把so对应cpu的文件夹和文件放入到libs,然后在gradle里增加ndk和sourceSets。但运行却出现找不到org.tensorflow.lite.Interpreter类的错误,我也用loadlibrary加载了so,不知道还需要哪些配置?希望得到帮助,谢谢!

watersoft123 commented 2 years ago

我又在一篇文章里面看到需要创建so与java的关联类,这个怎么关联?

benjaminwan commented 2 years ago

不是很明白你的问题。 tensorflow lite是google的机器学习推理框架,,通过编译成jni(也就是so文件)让java或kotlin可以调用。 推理框架是C++编写的,java部分只是桥接代码,把C++暴露出的C接口封装成对象和方法。 看你的问题,不知道我理解的有没有错误:你是想保留so文件,但java部分的桥接代码自己编写?

tensorflow lite是开源的,你可以直接看这部分的代码:

https://github.com/tensorflow/tensorflow/tree/master/tensorflow/lite/java https://github.com/tensorflow/tflite-support/tree/master/tensorflow_lite_support/java

watersoft123 commented 2 years ago

不是很明白你的问题。 tensorflow lite是google的机器学习推理框架,,通过编译成jni(也就是so文件)让java或kotlin可以调用。 推理框架是C++编写的,java部分只是桥接代码,把C++暴露出的C接口封装成对象和方法。 看你的问题,不知道我理解的有没有错误:你是想保留so文件,但java部分的桥接代码自己编写?

tensorflow lite是开源的,你可以直接看这部分的代码:

https://github.com/tensorflow/tensorflow/tree/master/tensorflow/lite/java https://github.com/tensorflow/tflite-support/tree/master/tensorflow_lite_support/java

是这样的,我是用一款第三方的开发工具B4A进行安卓应用开发的,它可以引入jar或aar,我通过AS生成了包含jar,so以及模型的aar。B4A调用aar后,so也成功加载了,初始化也没问题,但就是报找不到so中类的错误,后来我发现java和so之间应该有个你说的桥,但又不知道如何找到这些接口,谢谢你提供的链接,我看后发现接口函数很多,是不是都要写入到桥接类中?

watersoft123 commented 2 years ago

谢谢你提供的帮助,问题解决了,在B4X里面调用aar成功播放。我从项目的tensorflow lite中得到Java类,然后通过与so对应的package的形式放在了java下面,一次性成功了。 下面还有一个问题,我前不久也问过你,就是如何把so的体积减小,这可能涉及c++编译的东西,我是业余的对这个不知道如何下手,希望你有空的时候研究一下,据说可以缩小90%

benjaminwan commented 2 years ago

裁剪编译的aar已提供。

裁剪后aar下载