2012-01-20 40 views
0

我終於得到了編譯的代碼,但每次啓動時都會關閉它。任何人都可以告訴我什麼是錯的?應用程序一旦啓動就關閉

下面是清單以及活動中代碼的logcat和上半部分。

這是一個編碼器完成的應用程序項目。它使用本地庫。我用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(); 
+1

請在這裏發佈一些代碼。單獨清單是不夠的。已添加代碼 –

+0

。謝謝! – keithwb

回答

3

看來,問題是,編譯器不能找到你這樣的庫。這是你的項目還是你只是從互聯網上下載的?如果它來自互聯網,那麼你還應該檢查這個項目是否使用本地代碼(它是否有像.c,.cpp或.h文件那樣的jni文件夾?)。如果是的話,那麼你應該首先構建你的本地部分,並且只有在這之後你才能構建你的代碼。

+0

嗨,謝謝你的回覆。這是一個編碼器完成的項目。它使用本機代碼。我已經使用cygwin生成了本機代碼,並且檢查了提到的.so文件是在obj文件夾中生成的。任何想法我還缺少什麼?謝謝! – keithwb

1

如果您使用的是Android SDK中超過12個,試着刪除

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

清單中對其進行測試

,我曾經面臨的Android 4.0系統這個問題。

相關問題