Andorid编译so为什么必须要找接口实现?
无论是ndk还是源码环境下编译,都不能只提供头文件就行,都需要由编译器去找到具体实现的so才行,so里面没有实现对应的接口都会报错,如:error: undefined reference to 'SSL_library_init'
我以使用openssl为例,做了两个工程分别测试在ndk下编译和源码环境下编译的区别,发现都一个样。那就是必须要找到libcrypt.so和libssl.so才行。这有悖于我们对于so动态库的认知啊!请有识之士告诉我吧。
试验过程:
eclipse中的工程,用ndk编译so的,mk文件中:
LOCAL_PATH:= $(call my-dir) include $(CLEAR_VARS) LOCAL_SRC_FILES:= dingran_sotest_test_JniTest.c LOCAL_MODULE := soTest include $(BUILD_SHARED_LIBRARY)
对应的报错信息是:test_JniTest.c:14: undefined reference to `SSL_library_init'
如果把工程放到源码环境下编译,需要修改mk文件为:
LOCAL_PATH:= $(call my-dir) include $(CLEAR_VARS) LOCAL_SRC_FILES:= dingran_sotest_test_JniTest.c LOCAL_MODULE := soTest LOCAL_SHARED_LIBRARIES := \ libutils \ libstlport \ libcrypto \ libssl \ base := $(LOCAL_PATH) LOCAL_C_INCLUDES := \ $(base)/../include \ $(base)/../stbruntime \ include $(base)/../../stlport/libstlport.mk LOCAL_LDLIBS := -L$(SYSROOT)/usr/lib -llog LOCAL_PRELINK_MODULE := false LOCAL_MODULE_TAGS := optional include $(BUILD_SHARED_LIBRARY)
由于引用了
libcrypto \ libssl \
所以可以正常编译出来,这两个so都在out/下面的system/lib下。是伴随android的external/openssl/编译出来而存在的,所以我们可以直接用了。如果取消这两个库,那么结果和ndk一样:
error: undefined reference to 'SSL_library_init'
至于用ndk怎么编译使用openssl,那就待我下回做个Demo放放来吧,用的原理是预编译。反正是离不开接口的实现,哎,android真是牛逼,这样有什么好处呢?
提前非要找到实现,这样运行时就安全了?这样岂不是很麻烦。
相关推荐
**Android MuPDF 最新代码...总结,Android MuPDF最新代码编译的SO库为开发者提供了一个强大且灵活的PDF阅读解决方案。通过合理的集成和优化,可以在Android应用中实现高效、安全的PDF阅读功能,覆盖广泛的设备类型。
在Android开发中,有时我们需要利用C或C++的性能优势,这时就需要用到Android Studio的NDK(Native Development Kit)来编译C/C++代码,生成SO(Shared Object)动态链接库文件。这篇博客详细介绍了如何在Android ...
- 要在Android项目中使用libyuv,首先需要将编译好的.so动态库文件放入项目的jniLibs目录下,对应不同的CPU架构。 - 接下来,在Java或Kotlin代码中,通过JNI接口调用libyuv的C++函数进行颜色空间转换。 4. **编译...
在Android平台上,为了实现对音视频的处理,开发者通常需要将FFmpeg编译为适用于Android系统的动态链接库(.so文件)。在Linux环境下编译FFmpeg并集成到Android项目中,通常会借助于Android NDK(Native Development...
总之,这个“4.0.2的编译过的ffmpeg全款so for Android”提供了便利的手段,帮助开发者快速实现Android应用中的音视频处理功能。通过理解如何正确集成和使用这些.so文件,开发者可以构建出强大的多媒体应用,满足...
本文将详细讲解如何使用Android Studio和CMake编译FFmpeg库,生成SO共享库,并处理相关的头文件和CMakeLists配置。 首先,我们需要在Android Studio项目中引入CMake构建系统。打开`build.gradle`(Module级别)文件...
此压缩包“GDAL 2.4.3 编译完成的Android库(包含so可直接用).zip”提供了GDAL 2.4.3版本针对Android平台编译好的库文件,其中包含了可以直接在Android应用中使用的.so动态链接库。 GDAL的核心功能是支持多种地理...
首先,FFmpeg库在Android上使用时需要编译为特定架构的动态链接库(.so文件),因为Android支持多种处理器架构,例如arm64-v8a、armeabi、armeabi-v7a、x86和x86_64。这些文件夹分别对应了不同的CPU架构,确保了...
标题“ffmpeg6.0 android 编译库”表明这是一个针对 Android 平台编译的 FFmpeg 版本 6.0,意味着它已经被配置并构建为适合 Android 应用程序使用的静态或动态库。这个版本可能包含了 FFmpeg 最新的功能和性能优化,...
在这个编译工程中,我们将深入探讨如何在 Android 环境下构建和集成 GMSSL 3.0 库,以便为 Android 应用程序提供安全的网络通信功能。 首先,要理解 GMSSL 3.0 的核心功能,它主要提供了加密和解密、数字签名、密钥...
总结,制作和在Unity中调用SO文件的关键在于理解JNI接口的设计,正确配置C/C++编译环境,以及在Unity中适当地引入和调用SO文件。这个过程涉及到Android NDK开发、JNI编程以及Unity的插件集成,需要对这几个方面都有...
最后,你可以将生成的.so库集成到你的Android应用中,通过Java Native Interface (JNI) 或者C++ Support Library来调用LAME和FDK-AAC的接口,实现音频的编码和解码功能。 在mediademo这个示例项目中,你可能已经...
这个"onnxruntime-android so文件"是该引擎的一部分,主要包含预编译的库文件,使得开发者能够在Android应用中集成ONNX Runtime,以执行优化过的ONNX模型。 1. ONNX(Open Neural Network Exchange):ONNX是一种...
总结,Android Studio中使用第三方.so库涉及到了JNI接口、NDK、CMakeLists配置、本地方法的实现等多个步骤。正确理解和操作这些环节,可以顺利地在Android应用中集成和使用C/C++库,提升应用的性能和功能。在实际...
总的来说,集成FFmpeg到Android应用需要经历下载源码、配置环境、编译库、创建JNI接口和添加权限等多个步骤。这个过程可能有些复杂,但一旦完成,你就可以利用FFmpeg的强大功能实现各种音视频处理任务,比如播放、...
"libmupdf.so"作为NDK的一部分,是用C语言编写的,它提供了一个接口,使得Android应用能够调用MuPDF的底层渲染和解析功能,无需依赖Java层的解析机制,从而提高了性能和效率。 在编译"libmupdf.so"时,通常需要遵循...
### Android平台上SO文件(动态库)的编译方法 在Android开发过程中,有时我们需要使用到C或C++语言来编写一些性能敏感的部分或者利用现有的C/C++代码库。这就涉及到了JNI (Java Native Interface) 的使用,以及...
版本1.10的libmupdf.so是该软件的核心组件,它是一个动态链接库,主要为Android平台提供PDF处理功能。在Android应用开发中,这种库通常用于实现对PDF文档的高效、低资源消耗的查看和解析。 1. **MuPDF介绍** MuPDF...
总结,Android上的libusb编译涉及多个步骤,包括环境配置、源码获取、Android.mk编写、NDK编译、JNI接口实现以及应用集成。这个过程虽然复杂,但是一旦完成,就可以为Android应用提供强大的USB设备支持,使你的应用...