0

ようやくコードをコンパイルできましたが、起動するたびに閉じられます。誰が何が間違っているのか教えてもらえますか?

以下は、アクティビティのマニフェストと logcat、およびコードの上半分です。

これは、1 人のコーダーによって行われたアプリケーション プロジェクトです。ネイティブライブラリを使用しています。私は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: DEBUG/dalvikvm(390): ライブラリをロードしようとしています
> /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(ネイティブメソッド) 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 (ネイティブ メソッド) 01-20 14:08:19.791:
> ERROR/AndroidRuntime(390): 原因: java.lang.UnsatisfiedLinkError:
> ライブラリを読み込めません: link_image[1966]: 32 必要な読み込みができませんでした
> ライブラリ 'libiconv.so' for 'libexif2.so' (load_library[1108]: Library
> '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): のアクティビティ一時停止タイムアウト
> 活動記録{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% 解放
> 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

12を超えるAndroidSDKを使用している場合は、削除してみてください

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

それをテストするためのマニフェストで、私はかつてアンドロイド4.0システムでこの問題に直面しました。

于 2012-03-30T01:48:09.487 に答える