【问题标题】:Application closing once started应用程序启动后关闭
【发布时间】:2012-01-20 14:24:48
【问题描述】:

我终于得到了要编译的代码,但是每次我启动它时它都会关闭。谁能告诉我有什么问题?

下面是清单和 logcat 以及 Activity 中代码的上半部分。

这是一个由一名编码员完成的应用程序项目。它正在使用本机库。我已经使用 cygwin 编译了本机库。它能够成功编译。对于错误“无法为'libexif2.so'加载所需的库'libiconv.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: 调试/dalvikvm(390): 试图加载 lib > /data/data/com.kos.agphoto2/lib/libexif2.so 0x40642338 01-20 > 14:08:19.771:警告/dalvikvm(390):异常 > Ljava/lang/UnsatisfiedLinkError;初始化时抛出 > Lcom/kos/agphoto2/DetectCameraActivity; 01-20 14:08:19.771: > WARN/dalvikvm(390):类初始化在 newInstance 调用中失败 > (Lcom/kos/agphoto2/DetectCameraActivity;) 01-20 14:08:19.771: > DEBUG/AndroidRuntime(390): 关闭 VM 01-20 14:08:19.771: > WARN/dalvikvm(390): threadid=1: 线程以未捕获的异常退出 >(组=0x40014760)01-20 14:08:19.791:错误/AndroidRuntime(390): > 致命异常:主要 01-20 14:08:19.791:错误/AndroidRuntime(390): > java.lang.ExceptionInInitializerError 01-20 14:08:19.791: > 错误/AndroidRuntime(390):在 > java.lang.Class.newInstanceImpl(本机方法)01-20 14:08:19.791: > 错误/AndroidRuntime(390):在 > java.lang.Class.newInstance(Class.java:1301) 01-20 14:08:19.791: > 错误/AndroidRuntime(390):在 > android.app.Instrumentation.newActivity(Instrumentation.java:1022) > 01-20 14:08:19.791: 错误/AndroidRuntime(390): 在 > android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1663) > 01-20 14:08:19.791: 错误/AndroidRuntime(390): 在 > android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1764) > 01-20 14:08:19.791: 错误/AndroidRuntime(390): 在 > android.app.ActivityThread.access$1500(ActivityThread.java:122) 01-20 > 14:08:19.791: 错误/AndroidRuntime(390): 在 > android.app.ActivityThread$H.handleMessage(ActivityThread.java:1002) > 01-20 14:08:19.791: 错误/AndroidRuntime(390): 在 > android.os.Handler.dispatchMessage(Handler.java:99) 01-20 > 14:08:19.791: 错误/AndroidRuntime(390): 在 > android.os.Looper.loop(Looper.java:132) 01-20 14:08:19.791: > 错误/AndroidRuntime(390):在 > android.app.ActivityThread.main(ActivityThread.java:4025) 01-20 > 14:08:19.791: 错误/AndroidRuntime(390): 在 > java.lang.reflect.Method.invokeNative(Native Method) 01-20 > 14:08:19.791: 错误/AndroidRuntime(390): 在 > java.lang.reflect.Method.invoke(Method.java:491) 01-20 14:08:19.791: > 错误/AndroidRuntime(390):在 > com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:841) > 01-20 14:08:19.791: 错误/AndroidRuntime(390): 在 > com.android.internal.os.ZygoteInit.main(ZygoteInit.java:599) 01-20 > 14:08:19.791: 错误/AndroidRuntime(390): 在 > dalvik.system.NativeStart.main(Native Method) 01-20 14:08:19.791: > 错误/AndroidRuntime(390): 由: java.lang.UnsatisfiedLinkError: > 无法加载库:link_image[1966]:32 无法加载所需 > 库 'libexif2.so' 的库 'libiconv.so' (load_library[1108]: 库 > 'libiconv.so' 未找到)01-20 14:08:19.791: > 错误/AndroidRuntime(390):在 > java.lang.Runtime.loadLibrary(Runtime.java:430) 01-20 14:08:19.791: > 错误/AndroidRuntime(390):在 > java.lang.System.loadLibrary(System.java:554) 01-20 14:08:19.791: > 错误/AndroidRuntime(390):在 > com.kos.agphoto2.api.LibrariesHelper.loadNativeLibraries(LibrariesHelper.java:42) > 01-20 14:08:19.791: 错误/AndroidRuntime(390): 在 > com.kos.agphoto2.DetectCameraActivity.(DetectCameraActivity.java:78) > 01-20 14:08:19.791: 错误/AndroidRuntime(390): ... 15 更多 01-20 > 14:08:19.801:WARN/ActivityManager(81):强制完成活动 > com.kos.agphoto2/.DetectCameraActivity 01-20 14:08:20.315: > WARN/ActivityManager(81):活动暂停超时 > ActivityRecord{40b92fe8 com.kos.agphoto2/.DetectCameraActivity} 01-20 > 14:08:20.351:INFO/ActivityManager(81):显示 > com.android.launcher/com.android.launcher2.Launcher:+32s438ms 01-20 > 14:08:24.411: DEBUG/dalvikvm(81): GC_CONCURRENT 释放 207K, 15% free > 10682K/12487K,暂停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();

【问题讨论】:

  • 请在此处发布一些代码。单独的清单是不够的。

标签: android forceclose


【解决方案1】:

看来问题是编译器找不到你的so库。这是你的项目还是你刚刚从网上下载的?如果它来自 Internet,那么您还应该检查该项目是否使用本机代码(它是否有类似 jni 文件夹的 .c、.cpp 或 .h 文件?)。如果是,那么您应该首先构建您的本机部分,然后才能构建您的代码。

【讨论】:

  • 您好,感谢您的回复。这是一个程序员完成的项目。它正在使用本机代码。我使用 cygwin 生成了本机代码,并检查了提到的 .so 文件是否在 obj 文件夹中生成。知道我还缺少什么吗?谢谢!
【解决方案2】:

如果您使用的android sdk超过12,请尝试删除

&lt;uses-feature android:required="true" android:name="android.hardware.usb.host"&gt;&lt;/uses-feature&gt;

在清单中进行测试,我曾经在 android 4.0 系统上遇到过这个问题。

【讨论】:

    猜你喜欢
    • 2011-10-29
    • 2023-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-08
    • 2013-10-01
    • 2017-01-14
    • 1970-01-01
    相关资源
    最近更新 更多