如何在NDK上使用Android上的C函数

我想在Android应用程序中使用C语言编写的函数。 该function取自此处 。 我已经学会了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);