`

Jni生成动态库的过程中引用静态库

 
阅读更多

最近多了一个需求,为了避免我们的游戏被二次打包,需要在.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++代码调用,就一切正常。

 

一直没有解决~

  • 大小: 16.7 KB
  • 大小: 85.7 KB
  • 大小: 23.5 KB
分享到:
评论

相关推荐

    Jni测试引用第三方静态库和动态库demo

    本文将深入探讨如何在JNI中引用第三方的静态库(.a)和动态库(.so),并基于提供的"Jni测试引用第三方静态库和动态库demo"进行分析。 首先,我们需要了解静态库和动态库的区别。静态库是直接链接到目标程序中的,...

    VS2015 Android JNI 静态库 动态库 APK 本地调试DEMO

    总之,这个DEMO将带你体验如何在VS2015中实现Android JNI开发,创建和使用静态库与动态库,并进行本地调试。通过实践这个DEMO,你不仅能够掌握VS2015的Android开发环境,还能深化对JNI、库文件和本地调试的理解,为...

    通过JNI调用第三方动态库(生成两个.so文件)

    本示例将详细介绍如何通过JNI调用第三方动态库,并生成两个.so文件。 首先,我们需要了解.so文件在Android中的角色。在Linux系统(包括Android)中,.so文件是共享库的扩展名,这些库通常包含了C/C++编译的原生代码...

    使用jni生成neon优化的ffmpeg动态库

    根据ffmpeg.wps操作生成静态文件。...根据hello-jni.zip文件生成动态库。内附成功生成的动态库,为经过none优化的解码h264的so文件。 ndk版本:android-ndk-r8-linux-x86 ffmpeg版本:ffmpeg-0.11.3

    Android NDK生成及连接静态库与动态库的方法

    而应用开发者如何去连接这些生成的静态库或动态库。由于现在Android Studio已经比较成熟,因此以下描述将基于Android Studio的目录布局。 在Android Studio的一个项目工程下,会有一个app文件夹,这个文件夹主要存放...

    使用jni生成neon优化的ffmpeng动态库

    根据ffmpeg.wps操作生成静态文件。...根据hello-jni.zip文件生成动态库。内附成功生成的动态库,为经过none优化的解码h264的so文件。 ndk版本:android-ndk-r8-linux-x86.tar.bz2 ffmpeg版本:ffmpeg-0.11.3.tar.gz

    JNI开发之javah生成静态和非静态的两个头文件区别代码

    4. 编译C/C++代码生成动态链接库(`.dll`或`.so`)。 5. 在Java代码中使用`System.loadLibrary`加载本地库,并通过`native`关键字声明`doSomething`方法。 静态头文件简化了本地方法的实现,但也引入了内存管理的...

    JNI源码和动态库实验参考.rar_JNI源码_和动态库_实验参考

    加载动态库的过程可以通过`System.loadLibrary("libraryName")`在Java代码中完成,这里的"libraryName"是不带扩展名的动态库文件名。 在实验参考中,你可能找到以下知识点: 1. **JNI基本结构**:理解JNI函数的...

    android编译openssl静态库.a 动态库.so

    本篇文章将详细讲解如何在Android环境中编译OpenSSL静态库(.a)和动态库(.so)。 首先,你需要下载OpenSSL的源代码。在这个案例中,我们有一个名为`openssl-android-master`的压缩包,这是OpenSSL的一个Android适配...

    JNI 函数动态注册 JNIDynamicLoad

    4. 配置CMakeLists.txt:在CMakeLists.txt文件中,设置源文件、库依赖和目标生成信息,确保`JNI_OnLoad`函数所在的源文件被正确编译和链接。 5. 在Java层调用:在Java代码中,不再需要使用`registerNatives`方法,...

    jni动态加载方式示例工程

    动态加载JNI库的方式比静态加载更加灵活,因为无需在编译时将本地库链接到Java应用中。这种方式通常使用`System.loadLibrary()`的替代方法`System.load()`来实现。`System.loadLibrary()`会自动寻找对应的库文件,...

    android 简单demo实现将c++代码 编译成静态库和动态库

    本教程将指导你如何在Android Studio中创建一个简单的Demo,实现将C++代码编译成静态库(.a)和动态库(.so)。 一、环境准备 确保你已经安装了Android Studio,并且版本支持C++开发(自2.1版本开始,Android Studio...

    JNI开发——不同class类中的native本地方法的动态注册

    在Android开发中,JNI常用于提升性能、调用系统库或者实现特定硬件功能。本篇将深入探讨如何在多个类中动态注册JNI的本地方法,并进行模块化的代码管理。 在传统的JNI开发中,我们通常在Java类中声明`native`方法,...

    jni调用java静态方法

    编译C/C++代码生成动态链接库(如.so文件),然后在Java代码中加载该库。当运行Java程序时,`callFromJNI()`方法就会调用到对应的C/C++实现,进而调用到Java的静态方法`doSomething()`。 这就是在JNI中调用Java静态...

    FFmpeg4.2.2 编译包含动态库静态库 armv7-a.zip

    而静态库(.a文件)则在编译时会链接到目标程序中,形成一个单独的可执行文件,不依赖运行时环境中的库,但可能会导致生成的可执行文件较大。 对于Android开发来说,选择动态库还是静态库取决于具体需求。如果希望...

    JNI_OnLoad动态注册的例子

    在JNI中,`JNI_OnLoad`是一个特殊的方法,当本地库(native library)被Java虚拟机(JVM)加载时,会自动调用这个方法。这个函数为开发者提供了在库加载时执行初始化代码的机会,例如注册本地方法或设置全局变量。 ...

    Android平台的pjsip静态以及动态库

    2. 动态库:与静态库相反,动态库在运行时才被加载到进程内存中,因此生成的可执行文件较小。然而,动态库依赖于系统中的库文件,若目标系统缺少相应的库文件,程序将无法正常运行。Android动态库通常为.so文件,但...

    ltp4j的6个静态和动态库,parser_jni.lib,parser_jni.dll,parser_jni.dll等

    LTP4J的核心在于其提供的静态库(parser_jni.lib)和动态库(如parser_jni.dll),这些库文件是C++编写的底层实现,通过JNI(Java Native Interface)技术与Java代码进行交互。JNI允许Java代码直接调用C/C++的函数,...

    ffmpeg 3.1 android 静态库及动态库

    2. 构建动态库的配置过程与静态库类似,但需要去掉--disable-shared选项,并可能需要添加--enable-shared。 3. 动态库的文件扩展名为.so,同样会为不同的CPU架构生成多个版本。 4. 在Android应用中使用动态库,需要...

    JNI的两个头文件jni.h和jni_md.h

    4. **编译本地库**:将实现的C/C++代码编译为动态链接库或静态库,依赖于目标平台。 5. **加载本地库**:在Java代码中使用`System.loadLibrary`加载本地库,使Java虚拟机能够找到并调用本地方法。 值得注意的是,...

Global site tag (gtag.js) - Google Analytics