java - 如何通过 NDK 在 Android 上使用 C 函数

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

我想在 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/

相关文章:

android - onKeyListener 在虚拟键盘上不起作用

c - C语言中从字符串中删除一个字符

c - 如何将文件指针移动到文本文件中的下一个单词?

java - Android webRTC VideoTrack.addRenderer api 更改

c - 你如何在 C 中无限期地保持套接字连接打开?

java - SimpleDateFormat ("dd-MMM-YYYY") 提前一年打印年份

java - 在 selenium webdriver 中捕获屏幕截图

java - 正则表达式匹配用户代理中的版本号(没有应用程序中的名称)

java - 我可以获得 Resteasy 使用的 ResourceMethodRegistry

android - 如何更改 Android PopupMenu 宽度