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