Android Studio 中预建的 C 库
Prebuilt C library in Android Studio
几个月前,我开发了一个 Android 库,它使用 C 中的一些本机代码。我在 Eclipse 中开发了这样的库,因为 Android Studio 不支持 Android NDK。
为了分发库,我将项目编译为 .jar(不包括 AndroidManifest.xml
)。如果有人想在 Eclipse 中使用该库,只需在文件夹 /libs
中添加 .jar 以及所有体系结构的预构建 C 代码 (.so)。这行得通,客户端项目最终得到了这个文件:
MyProject
---| libs/
-------| Library.jar
-------| armeabi/
-------| x86/
-------| ...
现在我希望能够在 Android Studio 项目中以类似的方式使用我的库。
我尝试过的:
在应用模块的文件夹/libs
中添加Library.jar。然后,添加 build.gradle
文件(在 dependencies 中)compile files('libs/Library.jar')
。最后,在 jniLibs 中添加为所有架构编译的 C 代码 (.so)。
意思是,我有这个文件:
MyProject
---| app
-------| libs/
-----------| Library.jar
-------| jniLibs/
-----------| armeabi/
-----------| x86/
-----------| ...
然而,我总是以这个例外结束:
java.lang.UnsatisfiedLinkError: dalvik.system.PathClassLoader[DexPathList[[zip file "/data/app/com.example.app-1/base.apk"],nativeLibraryDirectories=[/vendor/lib, /system/lib]]] couldn't find "lib.so"
查过这个异常,是系统找不到编译好的C库导致的。但是,我不知道我可以将预构建的 C 库放在哪里,以便 Library.jar.
感谢您的回答。
看来您必须将 jniLibs 文件夹放入主模块下的 src 文件夹中。这样,Android Studio 应该能够选择 .so 文件。
结构应如下所示:
MyProject
---| libs/
-----| Library.jar
---| src/
-----| main/
-------| jniLibs/
---------| armeabi/
---------| x86/
---------| ...
来源:
您还可以在您的应用程序中定义 jniLibs 位置 build.gradle
sourceSets {
main {
jniLibs.srcDirs = [ 'your/path/to/jniLibs')]
}
}
几个月前,我开发了一个 Android 库,它使用 C 中的一些本机代码。我在 Eclipse 中开发了这样的库,因为 Android Studio 不支持 Android NDK。
为了分发库,我将项目编译为 .jar(不包括 AndroidManifest.xml
)。如果有人想在 Eclipse 中使用该库,只需在文件夹 /libs
中添加 .jar 以及所有体系结构的预构建 C 代码 (.so)。这行得通,客户端项目最终得到了这个文件:
MyProject
---| libs/
-------| Library.jar
-------| armeabi/
-------| x86/
-------| ...
现在我希望能够在 Android Studio 项目中以类似的方式使用我的库。
我尝试过的:
在应用模块的文件夹/libs
中添加Library.jar。然后,添加 build.gradle
文件(在 dependencies 中)compile files('libs/Library.jar')
。最后,在 jniLibs 中添加为所有架构编译的 C 代码 (.so)。
意思是,我有这个文件:
MyProject
---| app
-------| libs/
-----------| Library.jar
-------| jniLibs/
-----------| armeabi/
-----------| x86/
-----------| ...
然而,我总是以这个例外结束:
java.lang.UnsatisfiedLinkError: dalvik.system.PathClassLoader[DexPathList[[zip file "/data/app/com.example.app-1/base.apk"],nativeLibraryDirectories=[/vendor/lib, /system/lib]]] couldn't find "lib.so"
查过这个异常,是系统找不到编译好的C库导致的。但是,我不知道我可以将预构建的 C 库放在哪里,以便 Library.jar.
感谢您的回答。
看来您必须将 jniLibs 文件夹放入主模块下的 src 文件夹中。这样,Android Studio 应该能够选择 .so 文件。
结构应如下所示:
MyProject
---| libs/
-----| Library.jar
---| src/
-----| main/
-------| jniLibs/
---------| armeabi/
---------| x86/
---------| ...
来源:
您还可以在您的应用程序中定义 jniLibs 位置 build.gradle
sourceSets {
main {
jniLibs.srcDirs = [ 'your/path/to/jniLibs')]
}
}