如何使用C语言函数与Android的NDK [英] How to use C function on android with NDK

查看:171
本文介绍了如何使用C语言函数与Android的NDK的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想在一个Android应用程序使用C语言编写的函数。该功能是由这里拍摄。我学到的Andr​​oid NDK的一些基础知识,我自己可以使用的功能在我的Java源代码,但申请冻结当我打电话吧,比我要等到Android提供了我杀的应用程序。

JNI的签名是这样的:

  JNIEXPORT无效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) - GT; GetDirectBufferAddress(ENV,imageOut);
    toRGB565((无符号短*)cImageIn,widthIn,heightIn,(无符号整数*)cImageOut,WIDTHOUT,heightOut);    (* ENV) - GT; ReleaseByteArrayElements(ENV,imageIn,cImageIn,JNI_ABORT);
}

然后我加载它在Java中是这样的:

 静态{
    的System.loadLibrary(RGB);
}公共本土无效NativeYuv2rgb(字节[] imageIn,INT widthIn,INT heightIn,
    java.nio.Buffer中imageOut,诠释WIDTHOUT,诠释heightOut);

而当我把它称为,应用程序冻结(我没有得到任何错误)

  NativeYuv2rgb(this.cameraFrame,这一点。preVX,这一点。preVY,
              this.rgb,这preVX,这preVY)。

我想我可能会使用错误的变量类型为imageIn和imageOut,但我不知道......

感谢您的帮助!

编辑:这是从GDB输出:

 计划接收信号SIGSEGV,分割过错。
[切换主题4731]
0x8083f0b0在?? ()


解决方案

确定。段错误,是坏的指针操作的迹象。
改变了code下面的例子,测试以查看是否适合你:
你应该改变所有的

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

I want to use function written in C in an Android app. The function is taken from here. I've learned some basics of android NDK, I can manage to use the function in my Java source, but the application freezes when I call it, than I have to wait until android offers me to kill the app.

The JNI signature is this:

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);
}

Then I load it in Java like this:

static {
    System.loadLibrary("rgb");
}

public native void NativeYuv2rgb(byte[] imageIn, int widthIn, int heightIn,
    java.nio.Buffer imageOut, int widthOut, int heightOut);

And when I call it, app freezes (I don't get any error):

NativeYuv2rgb(this.cameraFrame, this.prevX, this.prevY, 
              this.rgb, this.prevX, this.prevY);

I guess I might use wrong variable types for the imageIn and imageOut, but I don't know...

Thanks for your help!

edit: This is output from GDB:

Program received signal SIGSEGV, Segmentation fault.
[Switching to Thread 4731]
0x8083f0b0 in ?? ()

解决方案

OK. Segmentation fault, is a sign of bad pointer manipulation. Change the the code to the example below , and test to see if that works for you: You should change all the

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

这篇关于如何使用C语言函数与Android的NDK的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆