Закрытие приложения после запуска

Наконец-то я получил код для компиляции, однако он закрывается каждый раз, когда я его запускаю. Может ли кто-нибудь посоветовать мне, что не так?

Ниже приведен манифест, логарифм и верхняя половина кода в действии.

это прикладной проект, сделанный одним кодером. он использует родную библиотеку. Я скомпилировал родную библиотеку с помощью cygwin. он может успешно скомпилироваться. для ошибки «не удалось загрузить необходимую библиотеку libiconv.so для libexif2.so» (load_library[1108]: библиотека libiconv.so не найдена) 01-20 14:08:19.791», я проверил, эти Создано 2 файла. есть ли еще место, куда мне нужно поместить файл библиотеки?

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
          package="com.kos.agphoto2"
          android:versionName="0.1"
          android:versionCode="1">
    <uses-feature android:required="true" android:name="android.hardware.usb.host"></uses-feature>
    <uses-sdk android:minSdkVersion="12"/>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

    <application android:debuggable="true">
        <activity android:name=".DetectCameraActivity" android:label="Detect Camera">
            <intent-filter>
                <action android:name="android.intent.action.MAIN"/>
                <category android:name="android.intent.category.LAUNCHER"/>
            </intent-filter>
            <intent-filter>
                <action android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED"/>
            </intent-filter>
            <meta-data android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED"
                android:resource="@xml/device_filter" />
        </activity>
    </application>
</manifest>
> 01-20 14:08:19.761: DEBUG/dalvikvm(390): Trying to load lib
> /data/data/com.kos.agphoto2/lib/libexif2.so 0x40642338 01-20
> 14:08:19.771: WARN/dalvikvm(390): Exception
> Ljava/lang/UnsatisfiedLinkError; thrown while initializing
> Lcom/kos/agphoto2/DetectCameraActivity; 01-20 14:08:19.771:
> WARN/dalvikvm(390): Class init failed in newInstance call
> (Lcom/kos/agphoto2/DetectCameraActivity;) 01-20 14:08:19.771:
> DEBUG/AndroidRuntime(390): Shutting down VM 01-20 14:08:19.771:
> WARN/dalvikvm(390): threadid=1: thread exiting with uncaught exception
> (group=0x40014760) 01-20 14:08:19.791: ERROR/AndroidRuntime(390):
> FATAL EXCEPTION: main 01-20 14:08:19.791: ERROR/AndroidRuntime(390):
> java.lang.ExceptionInInitializerError 01-20 14:08:19.791:
> ERROR/AndroidRuntime(390):     at
> java.lang.Class.newInstanceImpl(Native Method) 01-20 14:08:19.791:
> ERROR/AndroidRuntime(390):     at
> java.lang.Class.newInstance(Class.java:1301) 01-20 14:08:19.791:
> ERROR/AndroidRuntime(390):     at
> android.app.Instrumentation.newActivity(Instrumentation.java:1022)
> 01-20 14:08:19.791: ERROR/AndroidRuntime(390):     at
> android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1663)
> 01-20 14:08:19.791: ERROR/AndroidRuntime(390):     at
> android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1764)
> 01-20 14:08:19.791: ERROR/AndroidRuntime(390):     at
> android.app.ActivityThread.access$1500(ActivityThread.java:122) 01-20
> 14:08:19.791: ERROR/AndroidRuntime(390):     at
> android.app.ActivityThread$H.handleMessage(ActivityThread.java:1002)
> 01-20 14:08:19.791: ERROR/AndroidRuntime(390):     at
> android.os.Handler.dispatchMessage(Handler.java:99) 01-20
> 14:08:19.791: ERROR/AndroidRuntime(390):     at
> android.os.Looper.loop(Looper.java:132) 01-20 14:08:19.791:
> ERROR/AndroidRuntime(390):     at
> android.app.ActivityThread.main(ActivityThread.java:4025) 01-20
> 14:08:19.791: ERROR/AndroidRuntime(390):     at
> java.lang.reflect.Method.invokeNative(Native Method) 01-20
> 14:08:19.791: ERROR/AndroidRuntime(390):     at
> java.lang.reflect.Method.invoke(Method.java:491) 01-20 14:08:19.791:
> ERROR/AndroidRuntime(390):     at
> com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:841)
> 01-20 14:08:19.791: ERROR/AndroidRuntime(390):     at
> com.android.internal.os.ZygoteInit.main(ZygoteInit.java:599) 01-20
> 14:08:19.791: ERROR/AndroidRuntime(390):     at
> dalvik.system.NativeStart.main(Native Method) 01-20 14:08:19.791:
> ERROR/AndroidRuntime(390): Caused by: java.lang.UnsatisfiedLinkError:
> Cannot load library: link_image[1966]:    32 could not load needed
> library 'libiconv.so' for 'libexif2.so' (load_library[1108]: Library
> 'libiconv.so' not found) 01-20 14:08:19.791:
> ERROR/AndroidRuntime(390):     at
> java.lang.Runtime.loadLibrary(Runtime.java:430) 01-20 14:08:19.791:
> ERROR/AndroidRuntime(390):     at
> java.lang.System.loadLibrary(System.java:554) 01-20 14:08:19.791:
> ERROR/AndroidRuntime(390):     at
> com.kos.agphoto2.api.LibrariesHelper.loadNativeLibraries(LibrariesHelper.java:42)
> 01-20 14:08:19.791: ERROR/AndroidRuntime(390):     at
> com.kos.agphoto2.DetectCameraActivity.(DetectCameraActivity.java:78)
> 01-20 14:08:19.791: ERROR/AndroidRuntime(390):     ... 15 more 01-20
> 14:08:19.801: WARN/ActivityManager(81):   Force finishing activity
> com.kos.agphoto2/.DetectCameraActivity 01-20 14:08:20.315:
> WARN/ActivityManager(81): Activity pause timeout for
> ActivityRecord{40b92fe8 com.kos.agphoto2/.DetectCameraActivity} 01-20
> 14:08:20.351: INFO/ActivityManager(81): Displayed
> com.android.launcher/com.android.launcher2.Launcher: +32s438ms 01-20
> 14:08:24.411: DEBUG/dalvikvm(81): GC_CONCURRENT freed 207K, 15% free
> 10682K/12487K, paused 5ms+5ms
public class DetectCameraActivity extends Activity {
static {
    LibrariesHelper.loadNativeLibraries();
}

private GPContext c;
private ProgressDialog pd;
private Handler h;
private static final String DETECTCAMERA = "DETECTCAMERA";

private PendingIntent mPermissionIntent;
private UsbManager mUsbManager;
private UsbInterface mUsbIntf;
private UsbDeviceConnection mConnection;
private boolean mUsbConnected = false; // We only connect to one camera at a time. Ignore additional cameras
private boolean mForceClaim = true;

private static final String ACTION_USB_PERMISSION = "com.kos.agphoto2.USB_PERMISSION";
private final BroadcastReceiver mUsbReceiver = new BroadcastReceiver() {

    public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();

        if (ACTION_USB_PERMISSION.equals(action) || UsbManager.ACTION_USB_DEVICE_ATTACHED.equals(action)) {
            synchronized (this) {
                UsbDevice device = (UsbDevice)intent.getParcelableExtra(UsbManager.EXTRA_DEVICE);

                if (intent.getBooleanExtra(UsbManager.EXTRA_PERMISSION_GRANTED, false)) {
                    if(!mUsbConnected && device != null){
                        //call method to set up device communication
                        claimDevice(device);
                        mUsbConnected = true;
                   }
                } 
                else {
                    Log.d(DETECTCAMERA, "permission denied for device " + device);
                }
            }
        }

        if (UsbManager.ACTION_USB_DEVICE_DETACHED.equals(action)) {
              UsbDevice device = (UsbDevice)intent.getParcelableExtra(UsbManager.EXTRA_DEVICE);
              if (mUsbConnected && device != null) {
                  // call your method that cleans up and closes communication with the device
                  cleanUpDevices();
                  mUsbConnected = false;
              }
          }
    }
};

private void claimDevice(UsbDevice device) {
    Log.d(DETECTCAMERA, "Claiming device: " + device.toString());
    mUsbIntf = device.getInterface(0);
    // Only need following line if using Java to communicate
    // UsbEndpoint endpoint = mUsbIntf.getEndpoint(0);
    mConnection = mUsbManager.openDevice(device); 
    if(mConnection.claimInterface(mUsbIntf, mForceClaim))
        Log.d(DETECTCAMERA,"Interface succesfully claimed!");

}

private void cleanUpDevices() {
    if(mUsbConnected && mConnection!=null) {
        mConnection.close();
        if(mUsbIntf!=null) {
            mConnection.releaseInterface(mUsbIntf);
        }
    }
}

@Override
public void onCreate(final Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    //Set up USB stuff
    mUsbManager = (UsbManager) getSystemService(android.content.Context.USB_SERVICE);
    mPermissionIntent = PendingIntent.getBroadcast(this, 0, new Intent(ACTION_USB_PERMISSION), 0);
    IntentFilter filter = new IntentFilter(ACTION_USB_PERMISSION);
    registerReceiver(mUsbReceiver, filter);
    //Iterate over connect USB devices, check if any match our intent filter
    HashMap<String, UsbDevice> deviceList = mUsbManager.getDeviceList();
    Iterator<UsbDevice> deviceIterator = deviceList.values().iterator();

    //TODO: get list of device filters from resource file
//      XmlResourceParser xrp = getResources().getXml(R.xml.device_filter);


    while(deviceIterator.hasNext()){
        UsbDevice device = deviceIterator.next();
        //TODO: compare device to list of device filters
        // if( device.getVendorId() )
        mUsbManager.requestPermission(device, mPermissionIntent);
    }


    setContentView(R.layout.detect_camera);
//      getPanel().setMovementMethod(new ScrollingMovementMethod());
    h = new Handler() {
        @Override
        public void handleMessage(final Message msg) {
            if (msg.obj instanceof String) {
                final String s = (String) (msg.obj);
                getPanel().setText(s);
                getPanel().scrollTo(0, 0);
            }
            pd.dismiss();
        }
    };

    c = GPContextImpl.createNew();

person keithwb    schedule 20.01.2012    source источник
comment
Пожалуйста, разместите код здесь. Одного манифеста недостаточно.   -  person Shishir Shetty    schedule 20.01.2012


Ответы (2)


Похоже, проблема в том, что компилятор не может найти ваши библиотеки so. Это ваш проект или вы просто скачали его из интернета? Если это из Интернета, вам также следует проверить, использует ли этот проект собственный код (есть ли в нем что-то вроде папки jni с файлами .c, .cpp или .h?). Если да, то нужно сначала собрать нативную часть и только после этого делать сборку своего кода.

person Yury    schedule 20.01.2012
comment
привет, спасибо за ответ. это проект, сделанный кодером. он использует собственный код. я сгенерировал собственный код с помощью cygwin и проверил, что упомянутые файлы .so создаются в папке obj. Любая идея, что еще мне не хватает? благодарить! - person keithwb; 21.01.2012

Если вы используете Android SDK более 12, попробуйте удалить

<uses-feature android:required="true" android:name="android.hardware.usb.host"></uses-feature>

в манифесте, чтобы проверить его, я однажды столкнулся с этой проблемой в системе Android 4.0.

person yunzhi    schedule 30.03.2012