最近多了一个需求,为了避免我们的游戏被二次打包,需要在.so文件中检查签名的MD5值,而最好是把检查签名的做成一个.a文件,给游戏的.so文件使用。
于是我开始尝试生成.a文件给游戏的.so文件使用。
-------------------------------------------------
一些相关指令:
查看.a文件都包含了那些文件
ar -t xxx.a
查看.so文件接口
nm -D xxx.so
查看一个(.a .o .so)文件的接口
nm -C foo.a
nm -C foo.o
(加-C指令可以输出原始的函数声明,参考贴:http://blog.csdn.net/a_tu_/article/details/43987865)
-------------------------------------------------
第一天:
我折腾了一下在eclipse下开发纯C++,很好,还生成了静态库文件,good~
第二天:
1.我按网上说的方法写好了Android.mk文件
参考贴:http://www.cnblogs.com/codingking/p/3852857.html
2.进入jni所在目录,运行命令 ndk-build
3.尝试在游戏的.so文件中引用静态库,可是在生成.so文件时一直报错
按照情况四的来试,一直报错,为什么呢?按情况三,都一切ok,情况四就不行了。
后来我想起来,我的.a文件是用c++工程生成的,不是按照安卓这套逻辑来的,于是换成情况三中生成的.a文件,一切ok了!
4.后来,我尝试把c++代码,都放到静态库那里,运行时报错
后来在Linux上用 nm -D *.so 查看了一下动态库文件,放在静态库里编译的cpp文件,在so文件中都找不到相关的符号
再后来发现,静态库里定义JNI方法,例如:JNIEXPORT jstring JNICALL Java_***
java会调用失败
但是,只是定义一些普通的C++方法,给C++代码调用,就一切正常。
一直没有解决~
相关推荐
本文将深入探讨如何在JNI中引用第三方的静态库(.a)和动态库(.so),并基于提供的"Jni测试引用第三方静态库和动态库demo"进行分析。 首先,我们需要了解静态库和动态库的区别。静态库是直接链接到目标程序中的,...
总之,这个DEMO将带你体验如何在VS2015中实现Android JNI开发,创建和使用静态库与动态库,并进行本地调试。通过实践这个DEMO,你不仅能够掌握VS2015的Android开发环境,还能深化对JNI、库文件和本地调试的理解,为...
本示例将详细介绍如何通过JNI调用第三方动态库,并生成两个.so文件。 首先,我们需要了解.so文件在Android中的角色。在Linux系统(包括Android)中,.so文件是共享库的扩展名,这些库通常包含了C/C++编译的原生代码...
根据ffmpeg.wps操作生成静态文件。...根据hello-jni.zip文件生成动态库。内附成功生成的动态库,为经过none优化的解码h264的so文件。 ndk版本:android-ndk-r8-linux-x86 ffmpeg版本:ffmpeg-0.11.3
而应用开发者如何去连接这些生成的静态库或动态库。由于现在Android Studio已经比较成熟,因此以下描述将基于Android Studio的目录布局。 在Android Studio的一个项目工程下,会有一个app文件夹,这个文件夹主要存放...
根据ffmpeg.wps操作生成静态文件。...根据hello-jni.zip文件生成动态库。内附成功生成的动态库,为经过none优化的解码h264的so文件。 ndk版本:android-ndk-r8-linux-x86.tar.bz2 ffmpeg版本:ffmpeg-0.11.3.tar.gz
4. 编译C/C++代码生成动态链接库(`.dll`或`.so`)。 5. 在Java代码中使用`System.loadLibrary`加载本地库,并通过`native`关键字声明`doSomething`方法。 静态头文件简化了本地方法的实现,但也引入了内存管理的...
加载动态库的过程可以通过`System.loadLibrary("libraryName")`在Java代码中完成,这里的"libraryName"是不带扩展名的动态库文件名。 在实验参考中,你可能找到以下知识点: 1. **JNI基本结构**:理解JNI函数的...
本篇文章将详细讲解如何在Android环境中编译OpenSSL静态库(.a)和动态库(.so)。 首先,你需要下载OpenSSL的源代码。在这个案例中,我们有一个名为`openssl-android-master`的压缩包,这是OpenSSL的一个Android适配...
4. 配置CMakeLists.txt:在CMakeLists.txt文件中,设置源文件、库依赖和目标生成信息,确保`JNI_OnLoad`函数所在的源文件被正确编译和链接。 5. 在Java层调用:在Java代码中,不再需要使用`registerNatives`方法,...
动态加载JNI库的方式比静态加载更加灵活,因为无需在编译时将本地库链接到Java应用中。这种方式通常使用`System.loadLibrary()`的替代方法`System.load()`来实现。`System.loadLibrary()`会自动寻找对应的库文件,...
本教程将指导你如何在Android Studio中创建一个简单的Demo,实现将C++代码编译成静态库(.a)和动态库(.so)。 一、环境准备 确保你已经安装了Android Studio,并且版本支持C++开发(自2.1版本开始,Android Studio...
在Android开发中,JNI常用于提升性能、调用系统库或者实现特定硬件功能。本篇将深入探讨如何在多个类中动态注册JNI的本地方法,并进行模块化的代码管理。 在传统的JNI开发中,我们通常在Java类中声明`native`方法,...
编译C/C++代码生成动态链接库(如.so文件),然后在Java代码中加载该库。当运行Java程序时,`callFromJNI()`方法就会调用到对应的C/C++实现,进而调用到Java的静态方法`doSomething()`。 这就是在JNI中调用Java静态...
而静态库(.a文件)则在编译时会链接到目标程序中,形成一个单独的可执行文件,不依赖运行时环境中的库,但可能会导致生成的可执行文件较大。 对于Android开发来说,选择动态库还是静态库取决于具体需求。如果希望...
在JNI中,`JNI_OnLoad`是一个特殊的方法,当本地库(native library)被Java虚拟机(JVM)加载时,会自动调用这个方法。这个函数为开发者提供了在库加载时执行初始化代码的机会,例如注册本地方法或设置全局变量。 ...
2. 动态库:与静态库相反,动态库在运行时才被加载到进程内存中,因此生成的可执行文件较小。然而,动态库依赖于系统中的库文件,若目标系统缺少相应的库文件,程序将无法正常运行。Android动态库通常为.so文件,但...
LTP4J的核心在于其提供的静态库(parser_jni.lib)和动态库(如parser_jni.dll),这些库文件是C++编写的底层实现,通过JNI(Java Native Interface)技术与Java代码进行交互。JNI允许Java代码直接调用C/C++的函数,...
2. 构建动态库的配置过程与静态库类似,但需要去掉--disable-shared选项,并可能需要添加--enable-shared。 3. 动态库的文件扩展名为.so,同样会为不同的CPU架构生成多个版本。 4. 在Android应用中使用动态库,需要...
4. **编译本地库**:将实现的C/C++代码编译为动态链接库或静态库,依赖于目标平台。 5. **加载本地库**:在Java代码中使用`System.loadLibrary`加载本地库,使Java虚拟机能够找到并调用本地方法。 值得注意的是,...