package com.example.nativeopencvandroidtemplate import android.Manifest import android.app.Activity import android.content.pm.PackageManager import android.os.Bundle import androidx.core.app.ActivityCompat import android.util.Log import android.view.SurfaceView import android.view.WindowManager import android.widget.Toast import org.opencv.android.CameraBridgeViewBase import org.opencv.android.OpenCVLoader import org.opencv.core.Mat class MainActivity : Activity(), CameraBridgeViewBase.CvCameraViewListener2 { private var mOpenCvCameraView: CameraBridgeViewBase? = null override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) window.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON) // Request camera permission ActivityCompat.requestPermissions( this, arrayOf(Manifest.permission.CAMERA), CAMERA_PERMISSION_REQUEST ) setContentView(R.layout.activity_main) mOpenCvCameraView = findViewById(R.id.main_surface) mOpenCvCameraView?.apply { visibility = SurfaceView.VISIBLE setCvCameraViewListener(this@MainActivity) } } override fun onRequestPermissionsResult( requestCode: Int, permissions: Array, grantResults: IntArray ) { when (requestCode) { CAMERA_PERMISSION_REQUEST -> { if (grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED) { mOpenCvCameraView?.setCameraPermissionGranted() } else { Toast.makeText(this, "Camera permission required", Toast.LENGTH_LONG).show() } } } } override fun onResume() { super.onResume() // Initialize OpenCV if (!OpenCVLoader.initLocal()) { Log.e(TAG, "OpenCV initialization failed") Toast.makeText(this, "OpenCV initialization failed", Toast.LENGTH_LONG).show() return } // Load native library try { System.loadLibrary("native-lib") } catch (e: UnsatisfiedLinkError) { Log.e(TAG, "Failed to load native library: ${e.message}") Toast.makeText(this, "Failed to load native library", Toast.LENGTH_LONG).show() return } mOpenCvCameraView?.enableView() } override fun onPause() { super.onPause() mOpenCvCameraView?.disableView() } override fun onDestroy() { super.onDestroy() mOpenCvCameraView?.disableView() } override fun onCameraViewStarted(width: Int, height: Int) {} override fun onCameraViewStopped() {} override fun onCameraFrame(frame: CameraBridgeViewBase.CvCameraViewFrame): Mat { // Get current camera frame as grayscale val mat = frame.gray() // Process frame with native code adaptiveThresholdFromJNI(mat.nativeObjAddr) return mat } private external fun adaptiveThresholdFromJNI(matAddr: Long) companion object { private const val TAG = "MainActivity" private const val CAMERA_PERMISSION_REQUEST = 1 } }