Android------JNI的调用方法


Android------JNI的调用方法
1,调用的地方java类

如下:

package com.ming.camera;

//import android.content.Context;
//如果引用了这些外部包,javac时,必须使用/home/ming/Android/Sdk/platforms/android-23/android.jar参数,具体参考2步骤.
//import android.graphics.Bitmap;

public class LibVGestureDetect {
      static
       {
           System.loadLibrary("BlurModoule");
       }
       public static native void YUVtoRBGA(byte[] yuv420sp, int width, int height, int[] rgbOut);  

}

2,使用javac -classpath /home/ming/Android/Sdk/platforms/android-23/android.jar com/ming/camera/LibVGestureDetect.java 生成LibVGestureDetect.class文件

3,在src目录使用javah -classpath . -jni com.ming.camera.LibVGestureDetect 生成.h文件

(在jni开发中,有时候需要传入一个Context类型参数到C层,在使用javah生成头文件的时候,会报 javah Class android.content.Context could not be found.这个错误,原因是找不到android.content.Context该类,解决方法是,把Context类型改为Object类型即可。)

4,如果出现".class: major version 52 is newer than 51, the highest major version supported by this compiler"错误,说明javac 和javah版本不一致.可以使用"update-alternatives --config javac"切换javac版本重新来过

5,添加BlurModoule.so模块,根据.h文件建立BlurModoule.so模块


6,其中.so模块中,NV21toRGBA函数实现如下:

/*
 * Class:     com_gangyun_camera_LibBlurModule
 * Method:    NV21toRBGA
 * Signature: ([BII[I)V
 */
void JNICALL Java_com_ming_camera_LibBlurModule_NV21toRBGA
  (JNIEnv * env, jclass obj, jbyteArray yuv420sp, jint width, jint height, jintArray rgbOut)
  {
    int sz;
    int i;
    int j;
    int Y;
    int Cr = 0;
    int Cb = 0;
    int pixPtr = 0;
    int jDiv2 = 0;

    int R = 0;
    int G = 0;
    int B = 0;
    int cOff;

    int w = width;int h = height;
    sz = w * h;
    jint *rgbData = (jint*) ((*env)->GetPrimitiveArrayCritical(env, rgbOut, 0));
    jbyte* yuv = (jbyte*) (*env)->GetPrimitiveArrayCritical(env, yuv420sp, 0);
    for(j = 0; j < h; j++) {
        pixPtr = j * w;
        jDiv2 = j >> 1;
        for(i = 0; i < w; i++) {
            Y = yuv[pixPtr];
            if(Y < 0) {
                Y += 255;
            }
            if((i & 0x1) != 1) {
                cOff = sz + jDiv2 * w + (i >> 1) * 2;
                Cb = yuv[cOff];
                if(Cb < 0)
                {
                    Cb += 127;
                }
                else{
                    Cb -= 128;
                }
                Cr = yuv[cOff + 1];
                if(Cr < 0)
                {
                    Cr += 127;
                }
                else{
                    Cr -= 128;
                }
            }
             R = Y + Cr + (Cr >> 2) + (Cr >> 3) + (Cr >> 5);
             if(R < 0) {
                R = 0;
             }
             else if(R > 255) {
                R = 255;
             }
             G = Y - (Cb >> 2) + (Cb >> 4) + (Cb >> 5) - (Cr >> 1) + (Cr >> 3) + (Cr >> 4) + (Cr >> 5);
             if(G < 0) {
                G = 0;
             }
             else if(G > 255) {
                G = 255;
             }
             B = Y + Cb + (Cb >> 1) + (Cb >> 2) + (Cb >> 6);
             if(B < 0) {
                B = 0;
             }
             else if(B > 255) {
                B = 255;
             }
            //rgbData[pixPtr++] = 0xff000000 + (B << 16) + (G << 8) + R;
            rgbData[pixPtr++] = 0xff000000 + (R << 16) + (G << 8) + B;
         }
    }
    //gaussBlur(rgbData,width,height,5);
     (*env)->ReleasePrimitiveArrayCritical(env, rgbOut, rgbData, 0);
     (*env)->ReleasePrimitiveArrayCritical(env, yuv420sp, yuv, 0);
  }

7,调试对camera数据格式有疑问,调试; 可以用:
public static void writeBytesToFile2(ByteBuffer bss,String filename) throws IOException{

    //ByteBuffer bb = ByteBuffer.wrap(bss);

    FileChannel fc = new FileOutputStream(filename).getChannel();
    fc.write(bss);
    fc.close();
}
把camera数据留写成文件, 然后用pYUV工具打开保存的数据流文件;

yuv工具下载地址:https://pan.baidu.com/s/1zWulZ9NV2qfuB8FH0jiMJA

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

gnimey

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值