android jni 中jstring字符串的转化 和 一些常用数据转化

1、jni层,jstring转化为const char *

const char *tablePath = (env->GetStringUTFChars(tablePath_, 0));

2、jni层 jstring 转化为 char *

char *tablePath = const_cast<char *>(env->GetStringUTFChars(tablePath_, 0));

3、jni 函数中,将字符串string转化未 c++ 字符串string

方法1

std::string getString(JNIEnv *env , jstring jstring1 )
{
    const char *path =NULL;
    path = env->GetStringUTFChars(jstring1, 0);
    std::string spFn(path);
    env->ReleaseStringUTFChars(jstring1, path);
    return spFn;
}

 

方法2

    const char *tablePath = (env->GetStringUTFChars(tablePath_, 0));
    pTable = string(tablePath);
    env->ReleaseStringUTFChars(tablePath_, tablePath);

注意:释放掉 jni层获得java层string的开销

4 jni 相机数据yuv的获取,ByteBuffer 在c++中获得byte的数组指针

java层:

 private ImageReader.OnImageAvailableListener onImageAvailableListener = new ImageReader.OnImageAvailableListener() {
        @Override
        public void onImageAvailable(ImageReader reader) {
        
            Image mImage = reader.acquireLatestImage();
            if(mImage == null)
                return;

                Image.Plane[] planes = mImage.getPlanes();

        ByteBuffer Camera_y = planes[0].getBuffer();
        ByteBuffer Camera_u = planes[1].getBuffer();
        ByteBuffer Camera_v = planes[1].getBuffer();
 cameraData(planes[0].getBuffer(),planes[0].getRowStride() ,planes[0].getPixelStride(),
                        planes[1].getBuffer(),planes[1].getRowStride() ,planes[1].getPixelStride(),
                        planes[2].getBuffer(),planes[2].getRowStride() ,planes[2].getPixelStride(),
                        w,h , tablePath,1f , imageType);


}

}

public static native void cameraData(ByteBuffer Camera_y, int rowStride_y, int pixStride_y,
                                                       ByteBuffer Camera_u, int rowStride_u, int pixStride_u,
                                                       ByteBuffer Camera_v, int rowStride_v, int pixStride_v,
                                                       int width, int height , String tablePath , float progress ,int ImageType);


//Camera_y 、u 、v 是ByteBuffer
Java_com_example_lammy_Camera_cameraData(
        JNIEnv *env, jclass type, jobject Camera_y, jint rowStride_y, jint pixStride_y,
        jobject Camera_u, jint rowStride_u, jint pixStride_u, jobject Camera_v, jint rowStride_v,
        jint pixStride_v, jint width, jint height, jstring tablePath_ , jfloat progress ,jint imageType) {
    char *tablePath = const_cast<char *>(env->GetStringUTFChars(tablePath_, 0));

    jbyte *dataY = (jbyte *) env->GetDirectBufferAddress(Camera_y);
    jbyte *dataU = (jbyte *) env->GetDirectBufferAddress(Camera_u);
    jbyte *dataV = (jbyte *) env->GetDirectBufferAddress(Camera_v);
    unsigned char *y = (unsigned char *) dataY;
    unsigned char *u = (unsigned char *) dataU;
    unsigned char *v = (unsigned char *) dataV;
    ...
}

当然也可以直接传入byte数组,在java层获得,但效率相对低。

java

 byte []buffer_y = new byte[planes[0].getBuffer().remaining()];
                planes[0].getBuffer().get(buffer_y);
                byte []buffer_u = new byte[planes[1].getBuffer().remaining()];
                planes[1].getBuffer().get(buffer_u);
                byte []buffer_v = new byte[planes[2].getBuffer().remaining()];
                planes[2].getBuffer().get(buffer_v);
jbyteArray buffer_y;
jbyte *dataY2 = env->GetByteArrayElements(buffer_y , false);

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值