Android 为了在JNI中使用它,我如何从相机获取GLTexture?

Android 为了在JNI中使用它,我如何从相机获取GLTexture?,android,opengl-es,java-native-interface,android-camera,Android,Opengl Es,Java Native Interface,Android Camera,我曾尝试使用camera在JNI中开发基于OpenGLES的应用程序。但通过显示结果,我意识到相机的分辨率和纵横比以及GLTexture的分辨率是不同的。我将相机分辨率和GLtexture都设置为VGA(640*480) public类MainRenderer实现GLSurfaceView.Renderer, SurfacetTexture.OnFrameAvailableListener{ ... @凌驾 已创建曲面上的公共void(GL10 gl、EGLConfig配置){ ////摄像机/

我曾尝试使用camera在JNI中开发基于OpenGLES的应用程序。但通过显示结果,我意识到相机的分辨率和纵横比以及GLTexture的分辨率是不同的。我将相机分辨率和GLtexture都设置为VGA(640*480)

public类MainRenderer实现GLSurfaceView.Renderer,
SurfacetTexture.OnFrameAvailableListener{
...
@凌驾
已创建曲面上的公共void(GL10 gl、EGLConfig配置){
////摄像机////////////////////////////////////
int=0;
int numofCamera=Camera.getNumberOfCameras();
camerRainfo camerRainfo=新的camerRainfo();
对于(int i=0;i对于(int i=0;iThe SurfaceTexture构造函数将一个GLES纹理名称,即一个整数,作为参数。您不配置SurfaceTexture的大小;它接受传递给它的任何内容并将其转换为GLES纹理。不确定
JNIpr.init()是什么
调用完成或预期完成。另外,请记住图片大小和预览大小是独立的。@fadden那么我如何在jni中使用具有相同分辨率的摄影机图像流??GLES纹理具有与摄影机图像相同的分辨率(根据定义…不复制或操纵图像数据)。您需要配置相机以生成与显示匹配的宽高比预览图像(这在所有设备上都不可能),或将您的显示修改为信箱或柱形框以显示输出。您正在配置图片大小,但未配置预览大小,而且似乎预览不匹配。@fadden非常感谢:)您的评论对我有用
public class MainRenderer implements GLSurfaceView.Renderer,
                SurfaceTexture.OnFrameAvailableListener {
            ...
        @Override
        public void onSurfaceCreated(GL10 gl, EGLConfig config) {

            // ///////////////////// Camera ////////////////////////////////////
            int cameraid = 0;
            int numofCamera = Camera.getNumberOfCameras();
            CameraInfo cameraInfo = new CameraInfo();
            for (int i = 0; i < numofCamera; i++) {
                Camera.getCameraInfo(i, cameraInfo);
                if (cameraInfo.facing == CameraInfo.CAMERA_FACING_BACK/* CAMERA_FACING_FRONT */) {
                    cameraid = i;
                }
            }
            // ///////////////////// Camera ////////////////////////////////////

            mSurfaceTexture = new SurfaceTexture(JNIpr.init(tWidth, tHeight)); //resolution : 640,480
            mSurfaceTexture.setOnFrameAvailableListener(this);


            mCamera = Camera.open(cameraid);
            mCamera.stopPreview();
            //set camera to continually auto-focus
            Camera.Parameters params = mCamera.getParameters();

            params.setFocusMode(Parameters.FOCUS_MODE_AUTO);
            //some more settings


            List sizes = params.getSupportedPictureSizes();
            Camera.Size result = null;
            Camera.Size camSizeVGA = null;
                for (int i=0;i<sizes.size();i++){
                    result = (Size) sizes.get(i);
                    Log.i("msg", "Supported Size. Width: " + result.width + "height : " + result.height);
                    if(result.width==640 && result.height==480)
                    {
                        camSizeVGA = result;
                    }
                }


            //set camera resolution
            params.setPictureSize(camSizeVGA.width, camSizeVGA.height); 
            mCamera.setParameters(params);

            mCamera.startPreview();

            try {
                mCamera.setPreviewTexture(mSurfaceTexture);
            } catch (IOException ioe) {
            }

        }
        @Override
        public synchronized void onFrameAvailable(SurfaceTexture surfaceTexture) {
            mUpdateSurfaceTexture = true;
            mView.requestRender();
        }
        @Override
        public void onDrawFrame(GL10 gl) {
            synchronized (this) {
                if (mUpdateSurfaceTexture) {
                    mSurfaceTexture.updateTexImage();
                    mUpdateSurfaceTexture = false;
                }
            }

            long start = System.currentTimeMillis();
            pTime = JNIpr.render(filterID); // filterID : 0

            GLES20.glFinish();
            // ////////////////////////////////////
            long end = System.currentTimeMillis();
       }
}