问题“:Android:Buffer not large enough for pixels
解决方法:
在mbitmap.copyPixelsFromBuffer(buffer);这句之前加上一句:
buffer.rewind();
*env是java虚拟机的环境指针,也就是说,这个就指向了java虚拟机,你所有的操作都是对java操作的
C++中jbyte *arr = env-> GetByteArrayElements(jarr, 0);
c中jbyte * arr = (*env)-> GetByteArrayElements(env,jarr, NULL);
在C的定义中,env是一个两级指针,而在C++的定义中,env是个一级指针
如何将
java传入的String参数转换为c的char*,然后使用?
java传入的String参数,在c文件中被jni转换为jstring的
数据类型,在c文件中声明char* test,然后test = (char*)(*env)->GetStringUTFChars(env, jstring, NULL);注意:test使用完后,通知
虚拟机平台相关代码无需再访问:(*env)->ReleaseStringUTFChars(env, jstring, test);
3. 将c中获取的一个char*的buffer传递给
java?
这个char*如果是一般的字符串的话,作为string传回去就可以了。如果是含有’\0’的buffer,最好作为bytearray传出,因为可以制定copy的length,如果copy到string,可能到’\0’就截断了。
有两种方式传递得到的数据:
一种是在jni中直接new一个byte
数组,然后调用函数(*env)->SetByteArrayRegion(env, bytearray, 0, len, buffer);将buffer的值copy到bytearray中,函数直接return bytearray就可以了。
一个操作如GetFieldID,需要参数jclass,是一个类操作,因为它从一个类中获得field的描述。与此相反,GetIntField需要参数jobject,这是一个实例操作,因为它从这个实例中获得这个field的值。在所有的JNI方法中jobject和实例操作的结合和jclass和类操作的结合保持一致。所以是很容易记住类操作与实例操作的不同的。
AVFrame结构体一般用于存储原始数据(即非压缩数据,例如对视频来说是YUV,RGB,对音频来说是PCM)
JNI与java传递byte数组如下(基本类型直接传):