如题,有没有谁做过调用第三方so的啊,这个应该是个比较常规的问题,可是比较菜,网上查了好多关于这个的,自己写好了调用第三方so的代码,但是运行的时候总是提示找不到第三方的so。单独调用自己写的so是可以的,刚测试过,可以得到JNI的输出结果。
求大神知道啊。Android.mk
LOCAL_PATH := $(call my-dir)
### Link libXXX.so 
include $(CLEAR_VARS)  
LOCAL_MODULE := xxx
##
LOCAL_SRC_FILES := libxxx.so 
 
include $(PREBUILT_SHARED_LIBRARY) 
##
include $(CLEAR_VARS)
LOCAL_MODULE    := callxxx
LOCAL_SRC_FILES := callxxx.c
LOCAL_SHARED_LIBRARIES := xxx
##LOCAL_LDLIBS := -llog 
include $(BUILD_SHARED_LIBRARY)callxxx.c
#include <string.h>
#include <jni.h>
#include <dlfcn.h>jobject (*xxx) (jobject, jint, jstring, jint);JNIEXPORT jobject JNICALL Java_com_abc
  (JNIEnv * env, jobject thiz, jobject injob, jint type, jstring addr, jint num)
{
void *p;
p = dlopen("/data/data/com.a.abccc/lib/librecongi.so",RTLD_NOW);
xxx= dlsym(p,"xxx"); return (*xxx)(injob,type,addr,numofcandi);
}
JNIEXPORT jstring JNICALL Java_com_AddToList_testJNI
  (JNIEnv * env, jobject job)
{
return (*env)->NewStringUTF(env, "Hello from IME !");
}

解决方案 »

  1.   

    嗯,你指的路径是哪里的路径呢,是mk文件里的还是c文件里的,还是其他地方的呢?你之前做过这方面的吗?谢谢你了。
      

  2.   

    static
    {
    System.loadLibrary("xxx") ;
    System.loadLibrary("callxxx") ;
    }
    这是java里load .so文件的方式,是不是这样load不对呢?
      

  3.   


    System.loadLibrary 不会查找 data/data/com.a.abccc/lib/  目录
      

  4.   

    static
    {
    System.loadLibrary("xxx") ;
    System.loadLibrary("callxxx") ;
    }
    System.loadLibrary 的搜索路径由'java.library.path' 来决定
    System.out.println('加载库时搜索的路径列表:\n'+System.getProperty('java.library.path')); 
    如果不在这个目录下肯定找不到 
      

  5.   

    刚刚查过,路径列表里只有/system/lib,但是这个路径里没有我要加载的第三方so,我自己写的so也没有。
    但是在/data/data/工程目录/lib里找到了第三方so和我写的so。我用System.load("/data/data/工程目录/lib/libxxx.so");还是提示找不到,无语了。能帮我再看看吗,谢谢你了。
      

  6.   

    第三方so 放到 /system/lib 下测试一下 看能行不
      

  7.   

    测试过了,之前我自己写的so调用的时候是可以成功的,但是/system/lib下没有我写的so,这是怎么回事呢?
      

  8.   


    查找的目录是   APK lib path + system lib path能把报 错信息贴下吗?是找不到还是load fail
      

  9.   

    第三方的so文件是在NDK 环境下编译的么?
      

  10.   

    07-03 15:26:02.288: E/AndroidRuntime(9596): Caused by: java.lang.UnsatisfiedLinkError: Library xxx not found
    07-03 15:26:02.288: E/AndroidRuntime(9596):  at java.lang.Runtime.loadLibrary(Runtime.java:461)
    07-03 15:26:02.288: E/AndroidRuntime(9596):  at java.lang.System.loadLibrary(System.java:557)
    07-03 15:26:02.288: E/AndroidRuntime(9596):  at com.a.abcc.add.<clinit>(add.java:28)
    07-03 15:26:02.288: E/AndroidRuntime(9596):  ... 21 more
    谢谢你。
      

  11.   

    别人的so也许只适合他自己开发这个的系统上,android是开源的,你应该不是基于现有的android开发的吧?
    是有其他基于android开发的系统?
      

  12.   

    我查过第三方的so了,跟我自己写的so是一个类型的。说实话,没太明白你什么意思。呵呵,谢谢你。
      

  13.   

    android 你直接放在libs/armeabi目录下应该就可以load了,你在看看加载名字你的名字是否正确 如果是方法找不到一般就是你的jni定义有问题
      

  14.   

    libs/armeabi目录下ndk-build之后就有了第三方的库,但是还是找不到。是找不到库,不是方法。谢谢你的回复。
      

  15.   

    那你现在就是基于手机开发的吗?还是有其他的终端,我开发是基于mbox开发的,这个系统源码是经过定制的,so文件只能底层rm和cp,我的意思就是这个,我就想问你这个so也是适用于手机终端的?
      

  16.   

    是的,是基于手机开发的,so是在linux下编译的,基于arm的,手机上应该可以用吧。手机上用的so有什么特别的要求吗?
      

  17.   

    解压过了,apk里的so跟第三方的so不一样,编译之后生成了新的so,第三方so没有打包到apk里面,怎么打包进去啊,谢谢你。
      

  18.   

    这个so 不适应于android 手机
      

  19.   

    linux下编译的就通过linux rm和cp掉那个so文件
    放到系统lib里  位置是什么我不记得了  你查查看
      

  20.   

    你好,你的这个问题解决了吗? 我现在的问题和你一摸一样,就连错误信息都是一样的?你是怎么解决的啊 ?求demo 420890901qq.com 万分感谢啊
      

  21.   

    在根目录的.mk文件中加入LOCAL_JNI_SHARED_LIBRARIES := (生产的jni名字)。就可以解决问题了。
      

  22.   

    有android调用第三方so详细点的资料么?有的话发一份啊。
    [email protected]
    thank you