小弟前段时间用eclipse写了一个安卓工程,里面调用了一个可用的JNI动态库,实现对录音数据的处理。现在我想把这个处理放到底层(驱动层或者安卓层,反正就是不需要上层应用程序再调用),因为在底层我知道是可以直接调用用c写的so库文件的,但是不知道应该怎样调用这个现成的JNI so库文件呢?
    这个JNI so库文件的借口我都知道,全是之前JNI格式的。(在Java中声明为“public native int  Get();”,在对应的.h文件中定义为“JNIEXPORT jint JNICALL Java_HelloWorldnew_Get(JNIEnv *, jobject);”)。这样如果我在底层直接调用的时候包含了这个.h文件,然后直接调用Java_HelloWorldnew_Get(),应该是不对的吧?请高手指教谢谢
AndroidJNIso库调用linux

解决方案 »

  1.   

    Android HAL层用dlopen的方式去调用SO库.
      

  2.   

    谢谢解答。如上面所说我现在的so库是之前用JNI的方式编译出来的,我用dlopen打开之后,如果要调用一个函数(JNIEXPORT jint JNICALL Java_HelloWorldnew_Get())我怎么调用呢?直接Get,还是调用全名Java_HelloWorldnew_Get()?
    我刚才尝试了在调用这个库的.c文件中直接包含原有的.h文件,然后直接调用全名,但是在用参数的时候有一个jbyteArray的变量,我在c中用char型数组,提示错误“error: cannot convert 'char*' to '_jbyteArray*' for argument '3' to 'jint Java_cn_thinkit_libtvqe_TVQEJNI_TVqeGetVersion(JNIEnv*, _jobject*, _jbyteArray*, jshort)'”是不是我的思路完全错误呀
      

  3.   

    http://bbs.csdn.net/topics/390518747
    通过头文件来调用没试过,一般以前通过头文件来调用的话都是以.a的库文件提供的
      

  4.   

    这个网址的帖子我明白,我自己也调用过自己用c写的生成的so文件。只是我现在要用到的so库文件是按照jni的规则编译得到的,里面的东西都是针对java层调用jni方法实现的。现在我直接把这个so拿到hal层用,所以才有了现在的疑问。
        针对这个so库文件的头文件我也有,里面声明了jni的几个几口(如JNIEXPORT jint JNICALL Java_cn_libtvqe_TVQEJNI_TVqeFree  (JNIEnv * env, jobject j);),我在java层调用的时候直接用TVqeFree()就可以了,但是现在在hal层调用应该怎么调用?现在就是在这犯晕了
      

  5.   

     哦,原来是这样,那.....这个方法声音是供jni调的...不太清楚
      

  6.   

    额,悲剧呀
    按理说这个库应该重新编译,编译成标准的c借口的so库就可以直接用了。但是这样就需要修改源码,有点麻烦,所以我就想看看能不能直接调用可是从网上找的都是java调用jni的,或者c中调用c借口的,木有在c中调用原jni库的。