我在做android加载ndk提供的so,在写jni文件的时候,有一个疑问。
jni函数的命名  Native的对应函数名要以“Java_”开头,后面依次跟上Java的“package名”、“class名”、“函数名”,中间以下划线“_” 分割,
问题来了,为什么要加上类名了。
比如说:
jstring
Java_com_example_jintest_MainActivity_stringFromJNI( JNIEnv* env,
                                                  jobject thiz )
申明了函数stringFromJNI,那我只能够在MainActivity这个类文件中可以调用,要是我新建了一个类aa.class,
这个时候我申明本地方法public native String  stringFromJNI();
则无法找到这个函数。
请问各位大虾有办法吗?
如果是这样,那如果第3方给我一个编译好的so文件,那我不是没办法调用了?ndkjninative

解决方案 »

  1.   

    在MainActivity里定义一个静态的方法
    public static void fun(){
        stringFromJNI();
    }
    这样其他的类也可以调用这个接口了。
      

  2.   

    这是java jni规范,没法改,如果有给你的第三方so,你就必须自己写一个so对其进行包装,然后适合java的规范调用。
      

  3.   

    虚拟机是根据命名规范来实现对jni的调用的。
      

  4.   

    虛擬機在加載時會調用JniLoad函數,你可以在cpp文件中添加這個函數 格式爲
    jint JNI_OnLoad(JavaVM* vm, void* reserved)
    在這個函數自己編寫註冊需要的函數就可以了。源碼中的例子太多了,你查一下就可以
      

  5.   

    亲,
    这个名字一般是用下面的工具生成的,不用自己写
    jdk/bin/javah.exe