ant debug 出现 [dx] UNEXPECTED TOP-LEVEL EXCEPTION: [dx] java.nio.BufferOverflowException

先说下我电脑的软件环境配置:

adt-bundle-linux-x86_64-20131030

(adt-bundle-linux-x86_64-20131030/sdk/platforms下面的都是我从同时拷贝的,这个下载太繁琐了)

ndk是android-ndk-r9b

一、用ndk-build编译

1、进入例子的目录:

cd android-ndk-r9b/samples/hello-jni

2、跑以下命令生成build.xml

android list target //看一下

android update project -p . -s -t 3 //选择对应的target

3、$ANDROID_NDK/ndk-build

二、使用ant生成apk

ant debug

出现了如下问题:

djy@djy:~/AndroidTools/android-ndk-r9b/samples/hello-jni$ ant debug
Buildfile: /home/djy/AndroidTools/android-ndk-r9b/samples/hello-jni/build.xml


-set-mode-check:


-set-debug-files:


-check-env:
 [checkenv] Android SDK Tools Revision 22.3.0
 [checkenv] Installed at /home/djy/AndroidTools/adt-bundle-linux-x86_64-20131030/sdk


-setup:
     [echo] Project Name: HelloJni
  [gettype] Project Type: Application


-set-debug-mode:


-debug-obfuscation-check:


-pre-build:


-build-setup:
[getbuildtools] Using latest Build Tools: 19.0.0
     [echo] Resolving Build Target for HelloJni...
[gettarget] Project Target:   Android 4.0
[gettarget] API level:        14
     [echo] ----------
     [echo] Creating output directories if needed...
    [mkdir] Created dir: /home/djy/AndroidTools/android-ndk-r9b/samples/hello-jni/bin/rsObj
    [mkdir] Created dir: /home/djy/AndroidTools/android-ndk-r9b/samples/hello-jni/bin/rsLibs
     [echo] ----------
     [echo] Resolving Dependencies for HelloJni...
[dependency] Library dependencies:
[dependency] No Libraries
[dependency] 
[dependency] ------------------
[dependency] API<=15: Adding annotations.jar to the classpath.
     [echo] ----------
     [echo] Building Libraries with 'debug'...
   [subant] No sub-builds to iterate on


-code-gen:
[mergemanifest] No changes in the AndroidManifest files.
     [echo] Handling aidl files...
     [aidl] No AIDL files to compile.
     [echo] ----------
     [echo] Handling RenderScript files...
     [echo] ----------
     [echo] Handling Resources...
     [aapt] No changed resources. R.java and Manifest.java untouched.
     [echo] ----------
     [echo] Handling BuildConfig class...
[buildconfig] Generating BuildConfig class.


-pre-compile:


-compile:
    [javac] Compiling 1 source file to /home/djy/AndroidTools/android-ndk-r9b/samples/hello-jni/bin/classes


-post-compile:


-obfuscate:


-dex:
      [dex] input: /home/djy/AndroidTools/android-ndk-r9b/samples/hello-jni/bin/classes
      [dex] input: /home/djy/AndroidTools/adt-bundle-linux-x86_64-20131030/sdk/tools/support/annotations.jar
      [dex] Using Pre-Dexed annotations-07ccf53e4c762305df87014e8c03342d.jar <- /home/djy/AndroidTools/adt-bundle-linux-x86_64-20131030/sdk/tools/support/annotations.jar
      [dex] Converting compiled files and external libraries into /home/djy/AndroidTools/android-ndk-r9b/samples/hello-jni/bin/classes.dex...
       [dx] 
       [dx] UNEXPECTED TOP-LEVEL EXCEPTION:
       [dx] java.nio.BufferOverflowException
       [dx] at java.nio.Buffer.nextPutIndex(Buffer.java:501)
       [dx] at java.nio.HeapByteBuffer.putShort(HeapByteBuffer.java:296)
       [dx] at com.android.dex.Dex$Section.writeShort(Dex.java:818)
       [dx] at com.android.dex.Dex$Section.writeTypeList(Dex.java:870)
       [dx] at com.android.dx.merge.DexMerger$3.write(DexMerger.java:437)
       [dx] at com.android.dx.merge.DexMerger$3.write(DexMerger.java:423)
       [dx] at com.android.dx.merge.DexMerger$IdMerger.mergeUnsorted(DexMerger.java:317)
       [dx] at com.android.dx.merge.DexMerger.mergeTypeLists(DexMerger.java:423)
       [dx] at com.android.dx.merge.DexMerger.mergeDexes(DexMerger.java:163)
       [dx] at com.android.dx.merge.DexMerger.merge(DexMerger.java:187)
       [dx] at com.android.dx.command.dexer.Main.mergeLibraryDexBuffers(Main.java:439)
       [dx] at com.android.dx.command.dexer.Main.runMonoDex(Main.java:287)
       [dx] at com.android.dx.command.dexer.Main.run(Main.java:230)
       [dx] at com.android.dx.command.dexer.Main.main(Main.java:199)
       [dx] at com.android.dx.command.Main.main(Main.java:103)


BUILD FAILED
/home/djy/AndroidTools/adt-bundle-linux-x86_64-20131030/sdk/tools/ant/build.xml:892: The following error occurred while executing this line:
/home/djy/AndroidTools/adt-bundle-linux-x86_64-20131030/sdk/tools/ant/build.xml:894: The following error occurred while executing this line:
/home/djy/AndroidTools/adt-bundle-linux-x86_64-20131030/sdk/tools/ant/build.xml:906: The following error occurred while executing this line:
/home/djy/AndroidTools/adt-bundle-linux-x86_64-20131030/sdk/tools/ant/build.xml:284: null returned: 2


Total time: 1 second

解决办法:

命令行输入android:

$android

在弹出的界面将Android SDK Build-tools从19改为18.1.1。

重行ant debug即可


10-30 15:00:36.534605 13871 13871 E AndroidRuntime: FATAL EXCEPTION: main 10-30 15:00:36.534605 13871 13871 E AndroidRuntime: Process: com.oplus.autotest.filereplace, PID: 13871 10-30 15:00:36.534605 13871 13871 E AndroidRuntime: java.lang.RuntimeException: Unable to start activity ComponentInfo{com.oplus.autotest.filereplace/com.oplus.autotest.filereplace.MainActivity}: java.lang.reflect.InvocationTargetException 10-30 15:00:36.534605 13871 13871 E AndroidRuntime: at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:4372) 10-30 15:00:36.534605 13871 13871 E AndroidRuntime: at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:4569) 10-30 15:00:36.534605 13871 13871 E AndroidRuntime: at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:126) 10-30 15:00:36.534605 13871 13871 E AndroidRuntime: at android.app.servertransaction.TransactionExecutor.executeNonLifecycleItem(TransactionExecutor.java:179) 10-30 15:00:36.534605 13871 13871 E AndroidRuntime: at android.app.servertransaction.TransactionExecutor.executeTransactionItems(TransactionExecutor.java:114) 10-30 15:00:36.534605 13871 13871 E AndroidRuntime: at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:86) 10-30 15:00:36.534605 13871 13871 E AndroidRuntime: at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2902) 10-30 15:00:36.534605 13871 13871 E AndroidRuntime: at android.os.Handler.dispatchMessage(Handler.java:107) 10-30 15:00:36.534605 13871 13871 E AndroidRuntime: at android.os.Looper.loopOnce(Looper.java:282) 10-30 15:00:36.534605 13871 13871 E AndroidRuntime: at android.os.Looper.loop(Looper.java:387) 10-30 15:00:36.534605 13871 13871 E AndroidRuntime: at android.app.ActivityThread.main(ActivityThread.java:9500) 10-30 15:00:36.534605 13871 13871 E AndroidRuntime: at java.lang.reflect.Method.invoke(Native Method) 10-30 15:00:36.534605 13871 13871 E AndroidRuntime: at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:600) 10-30 15:00:36.534605 13871 13871 E AndroidRuntime: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1005) 10-30 15:00:36.534605 13871 13871 E AndroidRuntime: Caused by: java.lang.reflect.InvocationTargetException 10-30 15:00:36.534605 13871 13871 E AndroidRuntime: at java.lang.reflect.Method.invoke(Native Method) 10-30 15:00:36.534605 13871 13871 E AndroidRuntime: at com.oplus.autotest.filereplace.KitKt.getCplc(Kit.kt:17) 10-30 15:00:36.534605 13871 13871 E AndroidRuntime: at com.oplus.autotest.filereplace.MainActivity.onCreate(MainActivity.kt:117) 10-30 15:00:36.534605 13871 13871 E AndroidRuntime: at android.app.Activity.performCreate(Activity.java:9196) 10-30 15:00:36.534605 13871 13871 E AndroidRuntime: at android.app.Activity.performCreate(Activity.java:9168) 10-30 15:00:36.534605 13871 13871 E AndroidRuntime: at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1544) 10-30 15:00:36.534605 13871 13871 E AndroidRuntime: at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:4346) 10-30 15:00:36.534605 13871 13871 E AndroidRuntime: ... 13 more 10-30 15:00:36.534605 13871 13871 E AndroidRuntime: Caused by: java.lang.UnsupportedOperationException 10-30 15:00:36.534605 13871 13871 E AndroidRuntime: at com.vendor.nfc.VendorNfcAdapter.getVendorNfcAdapter(VendorNfcAdapter.java:79) 10-30 15:00:36.534605 13871 13871 E AndroidRuntime: ... 20 more
最新发布
10-31
你提供的日志是 **Android 应用崩溃(Crash)的完整堆栈跟踪**,来自进程 `com.oplus.autotest.filereplace`。这是一个典型的 **未捕获异常导致应用启动失败并退出** 的情况。 --- ### ✅ 核心结论 > ❌ 应用 `com.oplus.autotest.filereplace` 在启动 `MainActivity` 时因调用 NFC 相关私有 API 失败而崩溃,抛出了 `java.lang.UnsupportedOperationException`。 这个崩溃直接导致了之前看到的日志: ```log ActivityManager: Process com.oplus.autotest.filereplace (pid 13871) has died: prcp TOP ``` --- ## 🔍 崩溃日志逐行分析 ```log E AndroidRuntime: FATAL EXCEPTION: main E AndroidRuntime: Process: com.oplus.autotest.filereplace, PID: 13871 E AndroidRuntime: java.lang.RuntimeException: Unable to start activity ComponentInfo{com.oplus.autotest.filereplace/com.oplus.autotest.filereplace.MainActivity}: java.lang.reflect.InvocationTargetException ``` - 主线程发生致命异常; - 系统无法启动 `MainActivity`; - 实际异常被包装在 `InvocationTargetException` 中。 --- ### 🧵 异常链路追踪 #### 第一层:`RuntimeException` → 启动 Activity 失败 ```java at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:4372) ... Caused by: java.lang.reflect.InvocationTargetException ``` 说明 `onCreate()` 方法中通过反射调用某个方法时出错。 --- #### 第二层:`InvocationTargetException` → Kotlin 扩展函数调用失败 ```java at java.lang.reflect.Method.invoke(Native Method) at com.oplus.autotest.filereplace.KitKt.getCplc(Kit.kt:17) at com.oplus.autotest.filereplace.MainActivity.onCreate(MainActivity.kt:117) ``` 关键线索来了: - 在 `KitKt.getCplc(Kit.kt:17)` 中发生了异常; - 这个方法是在 `MainActivity.onCreate()` 第 117 行被调用; - `getCplc()` 是一个 Kotlin 扩展函数(由 `Kit.kt` 编译成静态方法); --- #### 第三层:真正的根源 —— `UnsupportedOperationException` ```java Caused by: java.lang.UnsupportedOperationException at com.vendor.nfc.VendorNfcAdapter.getVendorNfcAdapter(VendorNfcAdapter.java:79) ... 20 more ``` 👉 **这是崩溃的根本原因(Root Cause)!** - 调用了 `VendorNfcAdapter.getVendorNfcAdapter()`; - 该方法内部直接抛出了 `UnsupportedOperationException`; - 很可能是因为当前设备不支持特定 NFC 功能、NFC 服务未启用或硬件缺失。 --- ### 💡 代码逻辑推测(基于堆栈) 假设 `Kit.kt` 文件内容如下: ```kotlin // Kit.kt object Kit { fun getCplc(): String? { val adapter = VendorNfcAdapter.getVendorNfcAdapter() // ← Crash here (line 17) return adapter?.cplc // CPLC: Chip Production Life Cycle data } } ``` 然后在 `MainActivity.kt` 中: ```kotlin // MainActivity.kt override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) val cplc = Kit.getCplc() // ← line 117 textView.text = "CPLC: $cplc" } ``` 当设备没有实现 `VendorNfcAdapter` 或禁用了 NFC 时,`getVendorNfcAdapter()` 抛出异常,进而导致整个 Activity 启动失败。 --- ### ⚠️ 为什么抛出 `UnsupportedOperationException`? 通常这类异常出现在以下场景: | 场景 | 描述 | |------|------| | ❌ 接口存根实现 | 厂商 SDK 提供了一个“空壳”实现,用于适配不同机型,但某些功能未真正支持 | | 🔒 权限不足 | 需要特殊权限(如系统签名、oem permission)才能访问 NFC 底层 | | 📵 硬件缺失 | 设备无 NFC 芯片,或驱动未加载 | | 🧩 分支编译差异 | 测试 APK 安装在非目标设备上(例如本应只运行于带 NFC 的测试机) | 查看 `VendorNfcAdapter.java:79` 的典型实现可能是: ```java public static VendorNfcAdapter getVendorNfcAdapter() { throw new UnsupportedOperationException("Not supported on this device"); } ``` --- ### ✅ 解决方案建议 #### ✅ 1. 捕获异常防止崩溃(推荐修复方式) 修改 `Kit.kt`,安全地处理不支持的情况: ```kotlin fun getCplc(): String? { return try { val adapter = VendorNfcAdapter.getVendorNfcAdapter() adapter?.cplc } catch (e: UnsupportedOperationException) { Log.w("Kit", "Vendor NFC not supported", e) null } catch (e: Exception) { Log.e("Kit", "Unexpected error accessing NFC", e) null } } ``` 这样即使不支持也能优雅降级,而不是让 App 崩溃。 --- #### ✅ 2. 添加运行时判断(可选) 如果存在判断是否支持的方法,先检查再调用: ```kotlin if (isNfcFeatureAvailable()) { val cplc = Kit.getCplc() } ``` 或者使用 `PackageManager` 检查硬件: ```kotlin val hasNfc = packageManager.hasSystemFeature(PackageManager.FEATURE_NFC) ``` --- #### ✅ 3. 权限声明(若需要) 确保 `AndroidManifest.xml` 包含必要权限: ```xml <uses-permission android:name="android.permission.NFC" /> <uses-feature android:name="android.hardware.nfc" android:required="false" /> ``` 设置 `required="false"` 可允许无 NFC 设备安装运行。 --- ### 🛠️ 如何避免此类问题? | 措施 | 说明 | |------|------| | 🛡️ 所有 JNI/厂商 API 调用必须加 try-catch | 特别是私有、非公开 API | | 🧪 在多种设备上测试 | 尤其是不同配置的工程机与量产机 | | 📊 使用 Crash 监控工具 | 如 Firebase Crashlytics、Bugly | | 📁 日志输出详细上下文 | 方便定位哪一步出错 | --- ###
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值