0

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

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

这是由一位编码员完成的应用程序项目。它正在使用本机库。我已经使用 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();
4

2 回答 2

3

It seems that the problem is that the compiler cannot find your so libraries. Is this your project or you just downloaded it from the Internet? If it is from the Internet then you should also check if this project uses native code (does it have smth like jni folder with .c, .cpp or .h files?). If yes, then you should at first build your native part and only after this you can make a build of your code.

于 2012-01-20T17:10:59.983 回答
1

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

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

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

于 2012-03-30T01:48:09.487 回答