我想在 Android 应用程序中使用用 C 编写的函数。该函数取自here 。我已经学习了 android NDK 的一些基础知识,我可以设法在我的 Java 源代码中使用该函数,但是当我调用它时应用程序会卡住,而我必须等到 android 让我终止该应用程序。
JNI 签名是这样的:
JNIEXPORT void JNICALL Java_pda_lupa_callbacks_MySurfaceCallback_NativeYuv2rgb
(JNIEnv *env, jclass clazz,
jbyteArray imageIn, jint widthIn, jint heightIn,
jobject imageOut, jint widthOut, jint heightOut) {
jbyte *cImageIn = (*env)->GetByteArrayElements(env, imageIn, NULL);
jbyte *cImageOut = (jbyte*)(*env)->GetDirectBufferAddress(env, imageOut);
toRGB565((unsigned short*)cImageIn, widthIn, heightIn, (unsigned int*)cImageOut, widthOut, heightOut);
(*env)->ReleaseByteArrayElements(env, imageIn, cImageIn, JNI_ABORT);
}
然后我像这样用 Java 加载它:
static {
System.loadLibrary("rgb");
}
public native void NativeYuv2rgb(byte[] imageIn, int widthIn, int heightIn,
java.nio.Buffer imageOut, int widthOut, int heightOut);
当我调用它时,应用程序卡住(我没有收到任何错误):
NativeYuv2rgb(this.cameraFrame, this.prevX, this.prevY,
this.rgb, this.prevX, this.prevY);
我想我可能对 imageIn 和 imageOut 使用了错误的变量类型,但我不知道......
感谢您的帮助!
编辑:这是 GDB 的输出:
Program received signal SIGSEGV, Segmentation fault.
[Switching to Thread 4731]
0x8083f0b0 in ?? ()
最佳答案
好的。段错误是指针操作不当的标志。 将代码更改为下面的示例,并测试一下是否适合您: 您应该更改所有
jbyte *cImageIn = env->GetByteArrayElements(env, imageIn, NULL);
jbyte *cImageOut = (jbyte*) env->GetDirectBufferAddress(env, imageOut);
...
env->ReleaseByteArrayElements(env, imageIn, cImageIn, JNI_ABORT);
关于java - 如何通过 NDK 在 Android 上使用 C 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8303370/