`
dingran
  • 浏览: 375845 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Andorid编译so为什么必须要找接口实现?

 
阅读更多

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 最新代码编译的SO库

    **Android MuPDF 最新代码...总结,Android MuPDF最新代码编译的SO库为开发者提供了一个强大且灵活的PDF阅读解决方案。通过合理的集成和优化,可以在Android应用中实现高效、安全的PDF阅读功能,覆盖广泛的设备类型。

    AndroidStudio 编译C/C++文件生成SO文件

    在Android开发中,有时我们需要利用C或C++的性能优势,这时就需要用到Android Studio的NDK(Native Development Kit)来编译C/C++代码,生成SO(Shared Object)动态链接库文件。这篇博客详细介绍了如何在Android ...

    libyuv安卓Android 编译好SO库文件及源代码

    - 要在Android项目中使用libyuv,首先需要将编译好的.so动态库文件放入项目的jniLibs目录下,对应不同的CPU架构。 - 接下来,在Java或Kotlin代码中,通过JNI接口调用libyuv的C++函数进行颜色空间转换。 4. **编译...

    4.0.2的编译过的ffmpeg全款so for Android

    总之,这个“4.0.2的编译过的ffmpeg全款so for Android”提供了便利的手段,帮助开发者快速实现Android应用中的音视频处理功能。通过理解如何正确集成和使用这些.so文件,开发者可以构建出强大的多媒体应用,满足...

    Android studio CMake 编译ffmpeg SO库 头文件 和 CMakeLists

    本文将详细讲解如何使用Android Studio和CMake编译FFmpeg库,生成SO共享库,并处理相关的头文件和CMakeLists配置。 首先,我们需要在Android Studio项目中引入CMake构建系统。打开`build.gradle`(Module级别)文件...

    GDAL 2.4.3 编译完成的Android库(包含so可直接用).zip

    此压缩包“GDAL 2.4.3 编译完成的Android库(包含so可直接用).zip”提供了GDAL 2.4.3版本针对Android平台编译好的库文件,其中包含了可以直接在Android应用中使用的.so动态链接库。 GDAL的核心功能是支持多种地理...

    android ffmpeg so库 下载

    首先,FFmpeg库在Android上使用时需要编译为特定架构的动态链接库(.so文件),因为Android支持多种处理器架构,例如arm64-v8a、armeabi、armeabi-v7a、x86和x86_64。这些文件夹分别对应了不同的CPU架构,确保了...

    在Linux下编译FFmpeg+android ndk成功的脚本及so库

    在Android平台上,为了实现对音视频的处理,开发者通常需要将FFmpeg编译为适用于Android系统的动态链接库(.so文件)。在Linux环境下编译FFmpeg并集成到Android项目中,通常会借助于Android NDK(Native Development...

    ffmpeg6.0 android 编译库

    标题“ffmpeg6.0 android 编译库”表明这是一个针对 Android 平台编译的 FFmpeg 版本 6.0,意味着它已经被配置并构建为适合 Android 应用程序使用的静态或动态库。这个版本可能包含了 FFmpeg 最新的功能和性能优化,...

    gmssl 3.0 - android 编译工程

    在这个编译工程中,我们将深入探讨如何在 Android 环境下构建和集成 GMSSL 3.0 库,以便为 Android 应用程序提供安全的网络通信功能。 首先,要理解 GMSSL 3.0 的核心功能,它主要提供了加密和解密、数字签名、密钥...

    编译so文件 Unity调用so文件样例

    总结,制作和在Unity中调用SO文件的关键在于理解JNI接口的设计,正确配置C/C++编译环境,以及在Unity中适当地引入和调用SO文件。这个过程涉及到Android NDK开发、JNI编程以及Unity的插件集成,需要对这几个方面都有...

    交叉编译LAME,FDK-ACC的so库For Android.zip

    最后,你可以将生成的.so库集成到你的Android应用中,通过Java Native Interface (JNI) 或者C++ Support Library来调用LAME和FDK-AAC的接口,实现音频的编码和解码功能。 在mediademo这个示例项目中,你可能已经...

    onnxruntime-android so文件

    这个"onnxruntime-android so文件"是该引擎的一部分,主要包含预编译的库文件,使得开发者能够在Android应用中集成ONNX Runtime,以执行优化过的ONNX模型。 1. ONNX(Open Neural Network Exchange):ONNX是一种...

    Android Studio使用第三方so库时编译 demo

    总结,Android Studio中使用第三方.so库涉及到了JNI接口、NDK、CMakeLists配置、本地方法的实现等多个步骤。正确理解和操作这些环节,可以顺利地在Android应用中集成和使用C/C++库,提升应用的性能和功能。在实际...

    android编译ffmpeg库的demo【内置已编译好的SO文件】

    总的来说,集成FFmpeg到Android应用需要经历下载源码、配置环境、编译库、创建JNI接口和添加权限等多个步骤。这个过程可能有些复杂,但一旦完成,你就可以利用FFmpeg的强大功能实现各种音视频处理任务,比如播放、...

    android上so编译

    ### Android平台上SO文件(动态库)的编译方法 在Android开发过程中,有时我们需要使用到C或C++语言来编写一些性能敏感的部分或者利用现有的C/C++代码库。这就涉及到了JNI (Java Native Interface) 的使用,以及...

    MuPDF版本1.10编译的so库libmupdf.so

    版本1.10的libmupdf.so是该软件的核心组件,它是一个动态链接库,主要为Android平台提供PDF处理功能。在Android应用开发中,这种库通常用于实现对PDF文档的高效、低资源消耗的查看和解析。 1. **MuPDF介绍** MuPDF...

    android libusb 已经成功编译拿去能用

    总结,Android上的libusb编译涉及多个步骤,包括环境配置、源码获取、Android.mk编写、NDK编译、JNI接口实现以及应用集成。这个过程虽然复杂,但是一旦完成,就可以为Android应用提供强大的USB设备支持,使你的应用...

    libyuv 最新编译的Android库,需要的下载

    编译后的库文件通常包括静态库(.a)和动态库(.so),供Android应用链接使用。 **libyuv的关键功能** 1. **色彩空间转换**:libyuv支持多种色彩空间之间的转换,例如NV12到I420,YUV到RGB等,这对于视频编码和解码...

Global site tag (gtag.js) - Google Analytics