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

解决方案 »

  1.   

    肯定是可以调用的 ,问题是你那个动态库在android中兼容不...
       不行还是得自己移植一下。
       
      

  2.   

    兼容是指??
    就是从一个Android软件中提取出来的
    那么移植又该怎么做呢?
    大家都来出出主意啊
      

  3.   

    package cc.androidos.jni;
    public class JNI {
    static{
    System.loadLibrary("myjni");
    }
    public native  void write();
    }实验的例子就是这么简单是一个方法,用新建立的项目就用不了
    不懂传文件,见谅……我的目的是在自己的项目中调用别人的so文件
      

  4.   

    注意,我手头只有so文件以及我知道里面有哪些方法
    so文件是从别人的apk软件中那里提取出来的
      

  5.   

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

  6.   


    那个.so库是从Android软件中提取出来的都不行???
      

  7.   

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

  8.   

    SO文件的调用涉及到package以及及类名什么的一大堆,除非你定义的类名和文件名和他的一样。
      

  9.   


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

  10.   

    运行到相关函数的时候就页面跳回去,跑不过去
    logcat里面也没什么特殊报错
    AndroidRuntime ERROR:thread attach failed
    是哪出错了哦
      

  11.   

    直接调用的方法不可行,在Android中调用动态库有两种方法,一种通过ndk这个主要利用了java中的jni机制,一种是android中特有的方法,可以参看android中的源代码,该方法主要对jni中调用函数速度做了优化。
    跟据你以上所述,据我了解是不可行的,主要存在以下几个问题。
    1。你的so文件可能不是用交叉编译工具生成的,生成主要针对arm的代码。
    2。也是主要的不符合jni规范,导致在java和so之间调用失败。
    解决办法,看明白so反编译后的代码,弄懂jni,学会ndk,重写.
      

  12.   

    行不行不好说。有的可行有的不可行。
    还有与系统的一些文件有关,再就是如果是arm架构,在/build/core/下有一个prelink-map-arm.map的文件,里面有各个库对应的加载地址也有看一下。
    还有生成so文件时,做了那些优化。
      

  13.   

    首先要搞清楚,动态链接库是执行时候链接的。
    所以你应该将库文件name改为与Android.mk文件中LOCAL_JNI_SHARED_LIBRARIES的名字对应起来
    第二,通常情况下,你要将xxx.so文件放入对应的/data/data/com.xxx.xxx/lib 目录下就可以调用了
      

  14.   


    首先,把so文件拷贝到android项目的libs\armeabi。
    然后,编写Java文件调用so文件中的函数。System.loadLibrary("**");进行引用,然后编写相应的native函数。
    此处必须使用生成so文件时,你所引用的第三方so文件所创建时的包名是什么,你在你调用的项目包名也必须相同。
    由于我自己需要调用别人一个项目中的so文件,我自己试了,完全没有问题,希望能帮到你