Jni生成动态库的过程中引用静态库__小罗的博客-程序员秘密

技术标签: java  开发工具  安卓开发  c/c++  

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

 

一直没有解决~

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/ecjtu_lyc/article/details/84854766

智能推荐

【VMware vSAN 7.0】5.7 使用 vSAN 和 vSphere HA—我们有软硬件解决方案_vsan和vsphere_IT干货的博客-程序员秘密

可以在同一个集群中启用vSphere HA和VMware vSAN。vSphere HA为vSAN数据存储上的虚拟机提供与传统数据存储上的虚拟机相同级别的保护。该级别的保护在vSphere HA和vSAN进行交互时会有特定的限制。ESXi主机要求仅当满足以下条件时,才能将vSAN与 vSphere HA 集群配合使用:集群的ESXi主机必须全部为版本 5.5 Update 1 或更高版本。 集群必须最低具有三个ESXi主机。为达到最佳效果,请为vSAN集...

windows10安装python3.8.5+tensorflow_python3.8.5对应的tensorflow_rust&python的博客-程序员秘密

windows10升级安装python3.8.5原3.8.3进入网站:https://www.python.org/downloads/source/下载链接:(python.org网站上的下载链接,用迅雷下载速度会快很多)windows:1.https://www.python.org/ftp/python/3.8.5/python-3.8.5-amd64.exe(64位)#202007242.https://www.python.org/ftp/python/3.8.5/py..

Eclipse中设置SVN忽略文件和文件夹_eclipse设置svn忽略文件夹_不要忘了为什么出发的博客-程序员秘密

首先得知道,已经被SVN管理的文件或文件夹是不能被或略掉的。所以,以下配置只对未添加到SVN版本管理的文件或文件夹有效。Window–>Preferences–>Team–>Ignored Resource–>Add Pattern,输入需要被忽略的文件或文件夹即可。举个栗子:(1)忽略.class文件:*.class(2)忽略文件夹:*/target/*对于已经添加到SV...

李沐动手学深度学习V2-ResNet残差网络模型和代码实现_残差网络代码_cv_lhp的博客-程序员秘密

1.ResNet1.1 神经网络嵌套函数和非嵌套函数(前提知识):首先,假设有一类特定的神经网络架构F\mathcal{F}F,它包括学习速率和其他超参数设置。对于所有f∈Ff \in \mathcal{F}f∈F,存在一些参数集(例如权重和偏置),这些参数可以通过在合适的数据集上进行训练而获得。现在假设f∗f^*f∗是我们真正想要找到的函数,如果是f∗∈Ff^* \in \mathcal{F}f∗∈F,那我们可以轻而易举的训练得到它,但通常不能找到我们真正想要的函数f∗f^*f∗,相反,我们将尝试找到

2020MongoDB基本命令-U操作(改)_mongo -u_GGIOPPL的博客-程序员秘密

2020MongoDB基本命令-U操作(改)(未完)全部操作过程2020MongoDB基本命令-C操作(增)2020MongoDB基本命令-R操作(查)基础语法db.集合名.update(条件,新数据,[是否新增,是否修改多条])是否新增:条件匹配不到数据,则插入数据 ,true是插入,默认false是否修改多条:将匹配的数据都修改,true是都修改,默认false是值修改一条2.准备工作//使用test2数据库use test2//给c2集合添加数据,无需创建c2集合,直

【深度学习】Beam Search原理和实现、闲聊机器人优化_beam_width_OneTenTwo76的博客-程序员秘密

在进行模型评估的过程中,每次选择概率最大的token id作为输出,那么整个输出的句子的概率就是最大的么?又被称作束集搜索,是一种seq2seq中用来优化输出结果的算法(不在训练过程中使用)。例如:传统的获取解码器输出的过程中,每次只选择概率最大的那个结果,作为当前时间步的输出,等到输出结束,会发现整个句子可能并不通顺。虽然在每一个时间步上的输出确实是概率最大的,但是整体的概率不一定是最大的,经常把它叫做greedy search[贪心算法]

随便推点

vivox7Android版本怎么升级,vivo公布安卓7.1系统更新计划,老款机型也能升级_悦橦的博客-程序员秘密

【PConline 资讯】近日,vivo官方公布了新系统的消息。消息称,vivo将于下半年对旗下多款产品进行最新的Funtouch OS 3.1系统升级,据了解,Funtouch OS 3.1是基于安卓7.1系统进行的底层适配。而vivo上一个系统版本Funtouch OS 3.0是基于安卓6.0更新的,这也就意味着这些机型是直接从安卓6.0跨越到安卓7.1系统。据官方放出的图片消息,支持更新的不...

[导入]【翻译】WF从入门到精通(第六章):加载和卸载实例_weixin_30570101的博客-程序员秘密

摘要: 学习完本章,你将掌握:1.理解为什么要工作流实例卸载和重新加载及其时机2.理解工作流实例为什么要持久化及其时机3.搭建SQL Server 2005,使其为WF和工作流持久化提供支持4.使用SqlWorkflowPersistenceService服务5.在你的工作流代码中进行实例的加载和卸载6.使持久化服务能自动地加载工作流实例及卸载空闲中的工作流实例阅读全文...

eclipse中maven项目在启动运行时出现 Java.lang.NoClassDefFoundError 解决办法_lliushuzhaoo的博客-程序员秘密

1、 clean project2、项目右键选择maven,然后update project 进行更新,也可以 alt + F5快捷键3、右键Tomcat 进行clean4、Tomcat添加war包,启动运行项目即可

自定义ViewGroup之游标卡尺的实现_尽人事看天意的博客-程序员秘密

效果图预览 1. 分析1. 游标卡尺嘛首先得绘制一个尺子吧2. 有了尺子不得绘制刻度线3. 绘制具体刻度值4. 还要绘制能拨动的按钮,不然怎么叫游标卡尺5. 拨动尺子的时候应该是能实时看到数据2. 技术实现原理1. 尺子组成是一个长长的进度条加上带刻度线和刻度值的数据2. 进度条可以用canvas.drawRect画一个矩形3. 刻度线和刻度值分别用canvas...

页面元素居中的几种方法_木星的博客-程序员秘密

1前言做页面布局时,经常会需要将一些页面元素居中显示。当然,你可以设定元素的top、left来使它居中,但是,当父容器的大小发生变化,你不得不修改子元素的top、left来使它保持居中;当用户的显示器分辨率与你的测试机不同,可能会导致界面乱成一片,所以不管从代码的易维护性的角度还是从对不同分辨率显示器的适应性方面来说,这种设置固定值的方法显然是比较拙劣的。因此,做页面布局,应尽量减少使用固定值

活并快乐奋斗着的空间_tian19870221084的博客-程序员秘密

var rowEditing = Ext.create('Ext.grid.plugin.RowEditing',{saveBtnText:"保存",....................................................................,listeners:{edit:function(rowIndex){var select...

推荐文章

热门文章

相关标签