当前位置:编程学习 > wap >>

请问关于在Android程序中调用外部动态链接库的问题

大家好!
我现在做一个项目,是需要使用到外部链接库的.so文件的
现在问题是,那个.so文件不是我做的,是从别的软件反编译提取到的
我想知道怎么在自己的程序中调用到它,来实现我需要的功能。
反编译的代码我也看了,关于这儿库的本地静态方法也就三个,非常简单。
但问题就是出现在连接上,有关于使用到那个库的方法就跑不动了……

求高人指点!
首先,调用别人生成的.so库可不可行?
如果这个想法可行,那么就是怎么才能使用到? --------------------编程问答-------------------- 新人,分数少,关照一下,感激不尽! --------------------编程问答-------------------- 新人不会就20分吧,有结构了直接调用呗 --------------------编程问答--------------------
引用 2 楼 drsmart 的回复:
新人不会就20分吧,有结构了直接调用呗

可以直接调用吗?我就是直接调用一直不行
难道别人在别的程序上编译的.so库只能在他的程序上使用?
不知道有什么方法没

可以调用才能显示代码的可重用性嘛 --------------------编程问答-------------------- JNI+NDK吧,可能也没玩过。 --------------------编程问答-------------------- 肯定是可以调用的 ,问题是你那个动态库在android中兼容不...
   不行还是得自己移植一下。
    --------------------编程问答--------------------
引用 5 楼 vclongking 的回复:
肯定是可以调用的 ,问题是你那个动态库在android中兼容不...
  不行还是得自己移植一下。

兼容是指??
就是从一个Android软件中提取出来的
那么移植又该怎么做呢?
大家都来出出主意啊 --------------------编程问答-------------------- 你确定你调用其本地静态方法的参数个数、参数类型正确吗?你确定所有的参数值都符合其规范吗?

你确定此外部链接库so没有建立在其特定的环境下运行吗? --------------------编程问答--------------------
引用 7 楼 dryzeng 的回复:
你确定你调用其本地静态方法的参数个数、参数类型正确吗?你确定所有的参数值都符合其规范吗?

你确定此外部链接库so没有建立在其特定的环境下运行吗?

我实验过一个最最简单的例子,输出一句话
在例子工程中就没事
把.so文件弄过来,新建一个项目区调用就不行了
这其中有什么玄机呢?该怎么来建立连接? --------------------编程问答-------------------- 帮顶, 没用过,学习。 --------------------编程问答--------------------
引用 8 楼 toy2206757 的回复:
引用 7 楼 dryzeng 的回复:
你确定你调用其本地静态方法的参数个数、参数类型正确吗?你确定所有的参数值都符合其规范吗?

你确定此外部链接库so没有建立在其特定的环境下运行吗?

我实验过一个最最简单的例子,输出一句话
在例子工程中就没事
把.so文件弄过来,新建一个项目区调用就不行了
这其中有什么玄机呢?该怎么来建立连接?


你只是简单把一个.so文件弄过来了,它会不会依赖例子工程里的其它库呢? --------------------编程问答--------------------
引用 10 楼 dryzeng 的回复:
引用 8 楼 toy2206757 的回复:
引用 7 楼 dryzeng 的回复:
你确定你调用其本地静态方法的参数个数、参数类型正确吗?你确定所有的参数值都符合其规范吗?

你确定此外部链接库so没有建立在其特定的环境下运行吗?

我实验过一个最最简单的例子,输出一句话
在例子工程中就没事
把.so文件弄过来,新建一个项目区调用就不行了
这其中有什么玄机呢?该怎么来建立连接?……

我也在考虑是不是有什么因素影响到了
用那个最简单的例子实验却也不行……因为没什么特殊的复杂的地方
几乎是照搬原来的例子,重新建了一个项目而已,包名,类内容都一样的还不行…… --------------------编程问答-------------------- 首先,使用用别人的软件里提取出来的.so库,这个想法可不可行?
可行才能探讨怎么去使用啊 --------------------编程问答-------------------- 你把so文件发上来,什么方法需要调用,这样说,猜的好累啊 --------------------编程问答--------------------
引用 13 楼 drsmart 的回复:
你把so文件发上来,什么方法需要调用,这样说,猜的好累啊

package cc.androidos.jni;
public class JNI {
static{
System.loadLibrary("myjni");
}
public native  void write();
}

实验的例子就是这么简单是一个方法,用新建立的项目就用不了
不懂传文件,见谅……

我的目的是在自己的项目中调用别人的so文件 --------------------编程问答-------------------- 注意,我手头只有so文件以及我知道里面有哪些方法
so文件是从别人的apk软件中那里提取出来的 --------------------编程问答-------------------- 木有办法呀, android的动态库和linux的不兼容,估计你要拿源代码到android平台上重新编译。

通常linux上用的是glibc,android上是自己的bionic,差别很大的,连so文件格式及解析方法都不一样,根本没法兼容。 --------------------编程问答--------------------
引用 16 楼 freshui 的回复:
木有办法呀, android的动态库和linux的不兼容,估计你要拿源代码到android平台上重新编译。

通常linux上用的是glibc,android上是自己的bionic,差别很大的,连so文件格式及解析方法都不一样,根本没法兼容。


那个.so库是从Android软件中提取出来的都不行??? --------------------编程问答-------------------- 一般是可以的, 你看一下logcat报错在哪。

JNI是注册到java类中的借口,如果你扣别人的代码, 那你java那端的package及类名什么的都要和人家的一样,否则别人so库中的jni注册不进去的,你也就无从调用了。 --------------------编程问答--------------------
引用 18 楼 freshui 的回复:
一般是可以的, 你看一下logcat报错在哪。

JNI是注册到java类中的借口,如果你扣别人的代码, 那你java那端的package及类名什么的都要和人家的一样,否则别人so库中的jni注册不进去的,你也就无从调用了。

我也是这么想的,但建立一个一模一样的项目试验却失败了……
寻找原因中 --------------------编程问答-------------------- SO文件的调用涉及到package以及及类名什么的一大堆,除非你定义的类名和文件名和他的一样。 --------------------编程问答--------------------
引用 20 楼 killpoer3 的回复:
SO文件的调用涉及到package以及及类名什么的一大堆,除非你定义的类名和文件名和他的一样。

试过一模一样的,失败啊……还有没什么遗忘了? --------------------编程问答-------------------- 有没有人试过成功的呢?求分享经验 --------------------编程问答--------------------
引用 21 楼 toy2206757 的回复:
引用 20 楼 killpoer3 的回复:
SO文件的调用涉及到package以及及类名什么的一大堆,除非你定义的类名和文件名和他的一样。

试过一模一样的,失败啊……还有没什么遗忘了?


怎么个失败法你得给个log看一下啊。
java端包和类名什么的都要一样, 函数接口,参数及返回值要一摸一样,如果人家库中的jni反调java的函数或使用java类中的数据成员,要将自己的类中定义同样的东西。

总之,要想保证能用成功,一定要看过人家的源代码。 --------------------编程问答-------------------- 因为之前生成.so的相关文件,有提到包名类名什么的
多种途径失败后,现在怀疑是不是有唯一性啊,别的工程用不了?
有没有人试过成功的呢?? --------------------编程问答-------------------- 运行到相关函数的时候就页面跳回去,跑不过去
logcat里面也没什么特殊报错
AndroidRuntime ERROR:thread attach failed
是哪出错了哦 --------------------编程问答-------------------- 下载一个ndk,里面有samples --------------------编程问答-------------------- --------------------编程问答-------------------- 直接调用的方法不可行,在Android中调用动态库有两种方法,一种通过ndk这个主要利用了java中的jni机制,一种是android中特有的方法,可以参看android中的源代码,该方法主要对jni中调用函数速度做了优化。
跟据你以上所述,据我了解是不可行的,主要存在以下几个问题。
1。你的so文件可能不是用交叉编译工具生成的,生成主要针对arm的代码。
2。也是主要的不符合jni规范,导致在java和so之间调用失败。
解决办法,看明白so反编译后的代码,弄懂jni,学会ndk,重写. --------------------编程问答-------------------- 路过帮顶。 --------------------编程问答-------------------- 学习一下! --------------------编程问答-------------------- 学习下,没弄过~~ --------------------编程问答-------------------- 学习了~~~ --------------------编程问答-------------------- 行不行不好说。有的可行有的不可行。
还有与系统的一些文件有关,再就是如果是arm架构,在/build/core/下有一个prelink-map-arm.map的文件,里面有各个库对应的加载地址也有看一下。
还有生成so文件时,做了那些优化。 --------------------编程问答-------------------- 首先要搞清楚,动态链接库是执行时候链接的。
所以你应该将库文件name改为与Android.mk文件中LOCAL_JNI_SHARED_LIBRARIES的名字对应起来
第二,通常情况下,你要将xxx.so文件放入对应的/data/data/com.xxx.xxx/lib 目录下就可以调用了 --------------------编程问答-------------------- 请问楼主这个问题解决了吗?我现在也碰到调用外部动态链接库的问题了 --------------------编程问答-------------------- 请问楼主这个问题解决了吗?我现在也碰到调用外部动态链接库的问题了 --------------------编程问答-------------------- 楼主解决了没? --------------------编程问答--------------------
引用 楼主 toy2206757 的回复:
大家好!
我现在做一个项目,是需要使用到外部链接库的.so文件的
现在问题是,那个.so文件不是我做的,是从别的软件反编译提取到的
我想知道怎么在自己的程序中调用到它,来实现我需要的功能。
反编译的代码我也看了,关于这儿库的本地静态方法也就三个,非常简单。
但问题就是出现在连接上,有关于使用到那个库的方法就跑不动了……

求高人指点!
首先,调用别人生成的……


首先,把so文件拷贝到android项目的libs\armeabi。
然后,编写Java文件调用so文件中的函数。System.loadLibrary("**");进行引用,然后编写相应的native函数。
此处必须使用生成so文件时,你所引用的第三方so文件所创建时的包名是什么,你在你调用的项目包名也必须相同。
由于我自己需要调用别人一个项目中的so文件,我自己试了,完全没有问题,希望能帮到你
补充:移动开发 ,  Android
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,