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真是牛逼,这样有什么好处呢?
提前非要找到实现,这样运行时就安全了?这样岂不是很麻烦。
相关推荐
将AES加密算法用C语言实现并封装成JNI接口供Android调用,包含编译生成的SO库文件,以及Java声明和调用方法的简单例子。希望帮到有需要的朋友,如果觉得不错麻烦给个好评~~!
将C语言编写的3DES加密算法源码编译成Android下可调用的SO库文件,包含JNI源码以及Android MakeFile文件,可以很容易实现按需定制并重新编译成你想要的调用接口。
1,ffmpeg库在android上的移植。 2,怎么编译FFMPEG库 3,怎么编写JNI 4,接口调用
对于对在自己的Android NDK应用程序中使用Kerberos库或GSS-API接口感兴趣的Android开发人员来说,这将有所帮助。 默认情况下,此程序包使用预先构建的静态Kerberos和CyaSSL库,以便链接到KerberosApp应用程序的本...
1.2.2 从为什么选择java谈为什么不开源驱动程序 3 1.2.3 对驱动开发者来说是一把双刃剑 4 1.3 Android和Linux 4 1.3.1 Linux简介 5 1.3.2 Android和Linux的关系 5 1.4 简析Linux内核 8 ...
1.2.2 从为什么选择java谈为什么不开源驱动程序 3 1.2.3 对驱动开发者来说是一把双刃剑 4 1.3 Android和Linux 4 1.3.1 Linux简介 5 1.3.2 Android和Linux的关系 5 1.4 简析Linux内核 8 ...
1. 一个比较完整的c++实现的例子,提供各位同学参考(看辣么多理论不如操作个例子)。...5. 功能是一些比较简单的读取系统信息的接口,shell实现,各个系统有差异有问题注意修改,就是让大家理解一下binder。
Android Studio两个工程中:一个使用jni可以编译成so,一个app中加载so,调用jni的接口
android上使用tesseract进行OCR的源码,对tesseract3.01已近进行编译为.so,并写好JNI接口。源码可以直接在android上运行
1.2.2 从为什么选择java谈为什么不开源驱动程序 3 1.2.3 对驱动开发者来说是一把双刃剑 4 1.3 Android和Linux 4 1.3.1 Linux简介 5 1.3.2 Android和Linux的关系 5 1.4 简析Linux内核 8 ...
本资源深度裁剪于ffmpeg2.0解码器中的H264视频解码部分,编译成Android可调用的SO文件。附带有Android make文件以及JNI接口C源码文件等,特别适合于android下的视频开发(只适合H264视频格式的解码),可以通过简单...
1 Android build system 4 1.1 Basic 4 1.2 Executable 6 1.3 Shared Library 9 2 Android Initialization Process 11 3 Android JAVA AIDL Analysis 15 4 Android JAVA Binder IPC System 20 5 Android Media ...
JPcap移植到Android平台,这是编译后的库文件,在Android项目中可通过JPcap中的Java接口对之进行调用。
android 增量更新 bsdiff\bspatch库编译 具体思路参考 http://blog.csdn.net/hmg25/article/details/8100896 jni提供的接口: public native String bsdiff(String oldFilePath, String newFilePath, String ...
ffmpeg编译后的android版本,能够通过将so加载到本地android应用程序中,通过JNI编程,调用C层接口,实现FFmpeg接口调用,如rtsp,本地编解码,等等
在开发截屏应用的时候调用系统接口来截屏,自己单独写了一个jni来调用系统截屏接口 screencap ( frameworks/base/cmds/screencap/screencap.cpp),然后在源代码中编译jni成一个so文件(libscreencapjni.so),可是...
如果您的项目是一个使用gradle编译的AndroidStudio项目,那么集成是非常简单的。 首先,在buildscript的repositories里面加入mavenCenter,因为我们的库是公开在maven central的 buildscript { repositories { ...
Android安全应用逆向--23--反编译classes.dex文件.pdf Android安全应用逆向--24--使用Apktool解包并打包.pdf Android安全应用逆向--25--使用IDA静态分析so文件.pdf Android安全应用逆向--26--动态调试Smali源码.pdf ...
a) 若想改包名:解决方法,重新编译JNI文件生成.so文件(动态链接库) 2. src/com.dodola.patcher/ContantValue 下更改连接服务器的地址 (默认为: http://10.0.2.2:8080/项目名称/访问的setvlet名称) 3. 清单文件中...
Android安全开发基础: Java本地接口(JNI) Android安全开发基础: Android系统的启动过程分析 Android安全开发基础: 图形界面(UI)和碎片(Fragment)(上) Android安全开发基础: 图形界面(UI)和碎片(Fragment...