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

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zhangpengzp/article/details/87640809

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

猜你喜欢

转载自blog.csdn.net/zhangpengzp/article/details/87640809
今日推荐