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
答案 0 :(得分:2)
如果移动或重命名声明了本机方法的java类,则必须再次编译 .so 文件,您需要在c文件中更改相应的本机方法名称。在我们的案例中we have video.c file in jni folder。我们需要根据将使用此方法的java类的包名更新方法名,并添加" Java _ "作为方法名称的前缀。希望这个帮助。
答案 1 :(得分:1)
这是jni中的常见问题。
您的本机函数android类无法找到您在虚拟机上引用的函数。
有多种方法可以重现此错误:
有些设备使用armeabi,armeabi-V7等。因此,尝试在两个版本中交叉编译并放入jniLibs并为每个体系结构创建文件夹。
首先检查您是否在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
}
}