froyo的代码中mediaplayer模块mediaplayer.java中试这样是这样调用C++库的:
static {
        System.loadLibrary("media_jni");
        native_init();
    }
这个很好理解,但是Surface.java中:
native private static void nativeClassInit();
    static { nativeClassInit(); }只是调用了初始化的函数,它不需要loadLibrary吗?
还有SurfaceSession.java里面初始化的方法都没有,请问他们是怎么找到C++库的, 还是android有他自己的机制,求教,谢谢

解决方案 »

  1.   

    楼主可能以为,调用某个本地NAVTIVE代码就需要先System.loadLibrary其本地方法相对应的动态库文件.
    但是这样以为只正确了其一部分.
    还有一部分是如果System.loadLibrary本地方法相对应的动态库文件,那么下次就无需再System.loadLibrary了.
    例如:native private static void nativeClassInit();
      static { nativeClassInit(); }
    这个要地代码在调用之前.相对应的库就已经System.loadLibrary过了.只要没有卸载,就一直处于库装载状态.而什么时候System.loadLibrary相对的库的,我不晓得,不过可以肯定,相对应的库一定在调用static { nativeClassInit(); }前被装载了,或系统装载的也或是ANDROID框架启动装载的还或是你的程序装载启动的.至于具体什么时间装载的,反正它是提前装载了.
    希望对你有所帮助.
      

  2.   

    加载动态库只用加载一遍就OK了,就可以在你的程序中任意调用里面的JNI方法了。
      

  3.   

    在应用程序(apk)中需要加载JNI的库与调用本地接口:
    system.loadLibrary("libName")
    声明JNI的接口,以及直接将so载入
      

  4.   

    本帖最后由 yiyaaixuexi 于 2011-10-04 02:19:56 编辑
      

  5.   

    这个跟java的jar包一样,装到framework的东西当然不用再自己加载。