Android начать новый поток вызова функции JNI сбой

public class MainActivity extends AppCompatActivity {

    private ProcessWithQueue mprocessWithQueue;
    private LinkedBlockingQueue<byte []> mframeQueue;
    private NDKUtils ndk = new NDKUtils();
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        ...
        mframeQueue = new LinkedBlockingQueue<>();
        mprocessWithQueue = new ProcessWithQueue(mframeQueue);
        ...
    }

    public class ProcessWithQueue extends Thread {
        private LinkedBlockingQueue<byte[]> mQueue;

        public ProcessWithQueue(LinkedBlockingQueue<byte[]> frameQueue) {
            mQueue = frameQueue;
            start();
        }

        @Override
        public void run() {
            while (true) {
                byte[] frameData = null;
                try {
                    frameData = mQueue.take();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                if(frameData !=  null){
                    processFrame(frameData);
                }
            }
        }

        private void processFrame(byte[] tmpBytes) {
            //call JNI...
            //...
            int[] res = ndk.handleImg(pix,w,h)
            //...
        }
    }

    mImageReader.setOnImageAvailableListener(new ImageReader.OnImageAvailableListener() {
        @Override
        public void onImageAvailable(ImageReader reader) {
                ...
            //int [] res = ndk.handleImg(pix,w,h)
                ...
        }
    }
}

......JNI:

JNIEXPORT jintArray JNICALL Java_com_magicing_eigenndk_NDKUtils_handleImg(
      JNIEnv *env, jclass obj, jintArray buf, int w, int h) {
  jint *cbuf;
  cbuf = env->GetIntArrayElements(buf, JNI_FALSE );
  if (cbuf == NULL) {
      return 0;
  }
  Mat srcMat(h, w, CV_8UC4, (unsigned char *) cbuf);

  Mat dstMat1;
  .....
  jintArray rst = env->NewIntArray(rst_size+2);

  env->SetIntArrayRegion(rst,0,rst_size+2,temp);

  env->ReleaseIntArrayElements(buf, cbuf, 0);
    return rst;
}

Я создаю новую тему для обработки изображений предварительного просмотра из camera2и функция дескриптора от JNI. Когда дело дошло до вызова JNI, оно рухнуло. Как видите, если я вызываю его из основного потока, он работает хорошо. Но это делает страницу не беглой.

0 ответов

Другие вопросы по тегам