Android Studio导入含JNI代码的.AAR文件失败求助
解决AAR依赖后运行时出现NoClassDefFoundError(com.sun.jna.Structure)
问题背景
我给Android项目添加了一个包含JNI代码的AAR依赖,具体操作是在app模块的build.gradle中添加:
implementation files('libs/rustsdk/matrix-rust-sdk.aar')
其中libs/rustsdk是app目录下的子文件夹。项目可以正常导入和编译,但在模拟器运行时直接崩溃,抛出以下致命错误:
E/AndroidRuntime: FATAL EXCEPTION: main Process: com.example.myapplication, PID: 2138 java.lang.NoClassDefFoundError: Failed resolution of: Lcom/sun/jna/Structure; at com.example.myapplication.MainActivity.onCreate(MainActivity.kt:22) at android.app.Activity.performCreate(Activity.java:8000) at android.app.Activity.performCreate(Activity.java:7984) at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1309) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3422) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3601) at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:85) at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135) at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2066) at android.os.Handler.dispatchMessage(Handler.java:106) at android.os.Looper.loop(Looper.java:223) at android.app.ActivityThread.main(ActivityThread.java:7656) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947) Caused by: java.lang.ClassNotFoundException: Didn't find class "com.sun.jna.Structure" on path: DexPathList[[zip file "/data/app/~~3uqrtfBdNI7R0W86fLWX8w==/com.example.myapplication-xpIJTty5zNLizFxpMQy-kw==/base.apk"],nativeLibraryDirectories=[/data/app/~~3uqrtfBdNI7R0W86fLWX8w==/com.example.myapplication-xpIJTty5zNLizFxpMQy-kw==/lib/x86, /data/app/~~3uqrtfBdNI7R0W86fLWX8w==/com.example.myapplication-xpIJTty5zNLizFxpMQy-kw==/base.apk!/lib/x86, /system/lib, /system_ext/lib]] at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:207) at java.lang.ClassLoader.loadClass(ClassLoader.java:379) at java.lang.ClassLoader.loadClass(ClassLoader.java:312) at com.example.myapplication.MainActivity.onCreate(MainActivity.kt:22) at android.app.Activity.performCreate(Activity.java:8000) at android.app.Activity.performCreate(Activity.java:7984) at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1309) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3422) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3601) at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:85) at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135) at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2066) at android.os.Handler.dispatchMessage(Handler.java:106) at android.os.Looper.loop(Looper.java:223) at android.app.ActivityThread.main(ActivityThread.java:7656) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947) I/Process: Sending signal. PID: 2138 SIG: 9 Disconnected from the target VM, address: 'localhost:43017', transport: 'socket'
额外信息:
- 该AAR文件包含JNI相关的多架构so文件、classes.jar等内容
- 对比其他使用该AAR的项目,发现他们编译后
libs/rustsdk目录会生成build文件夹,但我的项目没有 - 已尝试过常见教程中的步骤,问题仍未解决
当前app模块的build.gradle代码如下:
plugins { id 'com.android.application' id 'org.jetbrains.kotlin.android' } android { namespace 'com.example.myapplication' compileSdk 33 defaultConfig { applicationId "com.example.myapplication" minSdk 26 targetSdk 33 versionCode 1 versionName "1.0" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" vectorDrawables { useSupportLibrary true } } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' } } compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 } kotlinOptions { jvmTarget = '1.8' } buildFeatures { compose true } composeOptions { kotlinCompilerExtensionVersion '1.2.0' } packagingOptions { resources { excludes += '/META-INF/{AL2.0,LGPL2.1}' } } } dependencies { implementation fileTree(dir: "libs", include: ["*.jar", "*.aar"]) implementation 'androidx.core:core-ktx:1.7.0' implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.3.1' implementation 'androidx.activity:activity-compose:1.3.1' implementation "androidx.compose.ui:ui:$compose_version" implementation "androidx.compose.ui:ui-tooling-preview:$compose_version" implementation 'androidx.compose.material3:material3:1.0.0-alpha11' implementation files('libs/rustsdk/matrix-rust-sdk.aar') testImplementation 'junit:junit:4.13.2' androidTestImplementation 'androidx.test.ext:junit:1.1.5' androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.1' androidTestImplementation "androidx.compose.ui:ui-test-junit4:$compose_version" debugImplementation "androidx.compose.ui:ui-tooling:$compose_version" debugImplementation "androidx.compose.ui:ui-test-manifest:$compose_version" }
解决方案
这个错误的核心原因是你引入的AAR依赖了JNA(Java Native Access)库,但你的项目没有添加JNA的依赖,导致运行时找不到com.sun.jna.Structure类。
步骤1:添加JNA依赖
在app模块的build.gradle的dependencies块中添加JNA的依赖:
implementation 'net.java.dev.jna:jna:5.13.0' implementation 'net.java.dev.jna:jna-platform:5.13.0'
版本号可以根据AAR实际依赖的版本调整,如果不确定,使用较新的稳定版本即可。
步骤2:清理并重新构建项目
- 执行
File -> Invalidate Caches... -> Invalidate and Restart清理缓存并重启Android Studio - 执行
Build -> Clean Project清理项目 - 执行
Build -> Rebuild Project重新构建项目
额外说明
关于libs/rustsdk目录没有生成build文件夹的问题,这是因为其他项目可能将该目录作为子模块或独立的构建单元处理,而你的项目只是将AAR作为本地文件依赖,不需要生成该目录的build文件夹,这个不是导致当前崩溃的原因。
内容的提问来源于stack exchange,提问作者carmius
相关产品推荐
相关产品推荐

