public class BinderConnector
{
- public BinderConnector(MarketConnector Market)
- {
- Init(Market);
+ public BinderConnector(MarketConnector Market) {
+ mMarket = Market;
+ }
+
+ public boolean Init() {
+ boolean result = false;
+ if (mIsReady)
+ result = Init(mMarket);
+
+ return result;
}
+
public native IBinder Connect();
+
public boolean Disconnect()
{
- Final();
- return true;
- }
+ if (mIsReady)
+ Final();
- static
- {
- System.loadLibrary("OpenCVEngine");
- System.loadLibrary("OpenCVEngine_jni");
+ return mIsReady;
}
private native boolean Init(MarketConnector Market);
- public native void Final();
+ private native void Final();
+ private static boolean mIsReady = false;
+ private MarketConnector mMarket;
+
+ static {
+ try {
+ System.loadLibrary("OpenCVEngine");
+ System.loadLibrary("OpenCVEngine_jni");
+ mIsReady = true;
+ }
+ catch(UnsatisfiedLinkError e) {
+ mIsReady = false;
+ e.printStackTrace();
+ }
+ }
+
}
import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
+import android.os.RemoteException;
import android.util.Log;
-
public class OpenCVEngineService extends Service
{
private static final String TAG = "OpenCVEngine/Service";
- private IBinder mEngineInterface;
+ private IBinder mEngineInterface = null;
private MarketConnector mMarket;
private BinderConnector mNativeBinder;
- public void onCreate()
- {
+
+ public void onCreate() {
Log.i(TAG, "Service starting");
super.onCreate();
Log.i(TAG, "Engine binder component creating");
mMarket = new MarketConnector(getBaseContext());
mNativeBinder = new BinderConnector(mMarket);
- mEngineInterface = mNativeBinder.Connect();
- Log.i(TAG, "Service started successfully");
+ if (mNativeBinder.Init()) {
+ mEngineInterface = mNativeBinder.Connect();
+ Log.i(TAG, "Service started successfully");
+ } else {
+ Log.e(TAG, "Cannot initialize native part of OpenCV Manager!");
+ Log.e(TAG, "Using stub instead");
+
+ mEngineInterface = new OpenCVEngineInterface.Stub() {
+
+ @Override
+ public boolean installVersion(String version) throws RemoteException {
+ // TODO Auto-generated method stub
+ return false;
+ }
+
+ @Override
+ public String getLibraryList(String version) throws RemoteException {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ @Override
+ public String getLibPathByVersion(String version) throws RemoteException {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ @Override
+ public int getEngineVersion() throws RemoteException {
+ return -1;
+ }
+ };
+ }
}
- public IBinder onBind(Intent intent)
- {
+ public IBinder onBind(Intent intent) {
Log.i(TAG, "Service onBind called for intent " + intent.toString());
return mEngineInterface;
}
+
public boolean onUnbind(Intent intent)
{
Log.i(TAG, "Service onUnbind called for intent " + intent.toString());
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
+
+ if (!HardwareDetector.mIsReady) {
+ Log.e(TAG, "Cannot initialize native part of OpenCV Manager!");
+
+ AlertDialog dialog = new AlertDialog.Builder(this).create();
+
+ dialog.setTitle("OpenCV Manager Error");
+ dialog.setMessage("OpenCV Manager is incompatible with this device. Please replace it with an appropriate package.");
+ dialog.setCancelable(false);
+ dialog.setButton("OK", new DialogInterface.OnClickListener() {
+
+ public void onClick(DialogInterface dialog, int which) {
+ finish();
+ }
+ });
+
+ dialog.show();
+ return;
+ }
+
setContentView(R.layout.main);
TextView OsVersionView = (TextView)findViewById(R.id.OsVersionValue);
}
});
+ mPackageChangeReciever = new BroadcastReceiver() {
+
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ Log.d("OpenCVManager/Reciever", "Bradcast message " + intent.getAction() + " reciever");
+ Log.d("OpenCVManager/Reciever", "Filling package list on broadcast message");
+ if (!bindService(new Intent("org.opencv.engine.BIND"), new OpenCVEngineServiceConnection(), Context.BIND_AUTO_CREATE))
+ {
+ TextView EngineVersionView = (TextView)findViewById(R.id.EngineVersionValue);
+ EngineVersionView.setText("not avaliable");
+ }
+ }
+ };
+
IntentFilter filter = new IntentFilter();
filter.addAction(Intent.ACTION_PACKAGE_ADDED);
filter.addAction(Intent.ACTION_PACKAGE_CHANGED);
@Override
protected void onDestroy() {
super.onDestroy();
- unregisterReceiver(mPackageChangeReciever);
+ if (mPackageChangeReciever != null)
+ unregisterReceiver(mPackageChangeReciever);
}
@Override
protected void onResume() {
super.onResume();
- Log.d(TAG, "Filling package list on resume");
- if (!bindService(new Intent("org.opencv.engine.BIND"), new OpenCVEngineServiceConnection(), Context.BIND_AUTO_CREATE))
- {
- TextView EngineVersionView = (TextView)findViewById(R.id.EngineVersionValue);
- EngineVersionView.setText("not avaliable");
+ if (HardwareDetector.mIsReady) {
+ Log.d(TAG, "Filling package list on resume");
+ OpenCVEngineServiceConnection connection = new OpenCVEngineServiceConnection();
+ if (!bindService(new Intent("org.opencv.engine.BIND"), connection, Context.BIND_AUTO_CREATE)) {
+ Log.e(TAG, "Cannot bind to OpenCV Manager service!");
+ TextView EngineVersionView = (TextView)findViewById(R.id.EngineVersionValue);
+ if (EngineVersionView != null)
+ EngineVersionView.setText("not avaliable");
+ unbindService(connection);
+ }
}
}
protected int ManagerApiLevel = 0;
protected String ManagerVersion;
- protected BroadcastReceiver mPackageChangeReciever = new BroadcastReceiver() {
-
- @Override
- public void onReceive(Context context, Intent intent) {
- Log.d("OpenCVManager/Reciever", "Bradcast message " + intent.getAction() + " reciever");
- Log.d("OpenCVManager/Reciever", "Filling package list on broadcast message");
- if (!bindService(new Intent("org.opencv.engine.BIND"), new OpenCVEngineServiceConnection(), Context.BIND_AUTO_CREATE))
- {
- TextView EngineVersionView = (TextView)findViewById(R.id.EngineVersionValue);
- EngineVersionView.setText("not avaliable");
- }
- }
- };
+ protected BroadcastReceiver mPackageChangeReciever = null;
protected class OpenCVEngineServiceConnection implements ServiceConnection
{
public void onServiceConnected(ComponentName name, IBinder service) {
OpenCVEngineInterface EngineService = OpenCVEngineInterface.Stub.asInterface(service);
+ if (EngineService == null) {
+ Log.e(TAG, "Cannot connect to OpenCV Manager Service!");
+ unbindService(this);
+ return;
+ }
+
try {
ManagerApiLevel = EngineService.getEngineVersion();
} catch (RemoteException e) {