我终于得到了要编译的代码,但是每次启动它时它都会关闭。谁能告诉我有什么问题?
下面是清单和 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();