android找不到相应的jni函数

时间:2016-05-26 06:21:07

标签: java android android-ndk java-native-interface

public native static int convertVideoFrame(ByteBuffer src, 
                                          ByteBuffer dest, 
                                          int destFormat, 
                                          int width, 
                                          int height, 
                                          int padding, 
                                          int swap);

Android告诉我他无法找到相应的JNI函数。

这些文件位于正确的架构图中的 jniLibs 中。

这是否与我的包名有关,他试图在我的包中找到它而不是在so库中找到它?

当我跑步时,我得到:

No implementation found for native Lorg/telegram/Utilities;.
    convertVideoFrame:(Ljava/nio/ByteBuffer;Ljava/nio/ByteBuffer;IIIII)I

2 个答案:

答案 0 :(得分:2)

如果移动或重命名声明了本机方法的java类,则必须再次编译 .so 文件,您需要在c文件中更改相应的本机方法名称。在我们的案例中we have video.c file in jni folder。我们需要根据将使用此方法的java类的包名更新方法名,并添加" Java _ "作为方法名称的前缀。希望这个帮助。

答案 1 :(得分:1)

这是jni中的常见问题。

您的本机函数android类无法找到您在虚拟机上引用的函数。

有多种方法可以重现此错误:

  1. 您的目标架构:
  2. 有些设备使用armeabi,armeabi-V7等。因此,尝试在两个版本中交叉编译并放入jniLibs并为每个体系结构创建文件夹。

    1. 确保您的功能名称正确
    2. 首先检查您是否在JNI中使用了正确的命名法。 如果您的java包名称是 foo.com ,并且您定义本机函数的类是 JniManager.java ,并且您的函数是 yourFunction

      JNIEXPORT jint JNICALL
                  Java_foo_com_JniManger_yourFunction(JNIEnv *env,jobject instance);
      

      如果您使用.h文件,请使用extern" C"。

      extern "C"
      {
        JNIEXPORT jint JNICALL Java_foo_com_JniManger_yourFunction(JNIEnv*env,jobject instance);
        JNIEXPORT jint JNICALL Java_foo_com_JniManger_yourFunction(JNIEnv*env,jobject instance)
          {
             //your body
          }
      }