有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何在安卓和NDK上使用C函数

我想在Android应用程序中使用C语言编写的函数。该函数取自here。我已经学习了安卓NDK的一些基础知识,我可以在我的Java源代码中使用该功能,但当我调用它时,应用程序会冻结,而我必须等到安卓让我关闭该应用程序

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 ?? ()

共 (1) 个答案

  1. # 1 楼答案

    嗯。分段错误,是指针操作错误的标志。 将代码更改为下面的示例,并进行测试,看看这是否适用于您: 你应该改变所有的习惯

    jbyte *cImageIn = env->GetByteArrayElements(env, imageIn, NULL);
    jbyte *cImageOut = (jbyte*) env->GetDirectBufferAddress(env, imageOut);
    ...
    env->ReleaseByteArrayElements(env, imageIn, cImageIn, JNI_ABORT);