我想在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);
以上就是c/c++开发分享如何在NDK上使用Android上的C函数相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/c-cdevelopment/522126.html