Jni/NDK常见问题

来源:互联网 发布:微信二级分销系统源码 编辑:程序博客网 时间:2024/06/05 13:27

1.没有配置Android.mk或者CMakeLists.txt

Error:Execution failed for task ':app:compileDebugNdk'.> com.android.ide.common.process.ProcessException: Error while executing process C:\Users\Administrator\AppData\Local\Android\Sdk\ndk-bundle\ndk-build.cmd with arguments {NDK_PROJECT_PATH=null APP_BUILD_SCRIPT=E:\csy\GitDev\jni\jni-encrypt\EncryptUtils\app\build\intermediates\ndk\debug\Android.mk APP_PLATFORM=android-23 NDK_OUT=E:\csy\GitDev\jni\jni-encrypt\EncryptUtils\app\build\intermediates\ndk\debug\obj NDK_LIBS_OUT=E:\csy\GitDev\jni\jni-encrypt\EncryptUtils\app\build\intermediates\ndk\debug\lib APP_ABI=mips64,x86_64,x86,armeabi-v7a,armeabi,mips,arm64-v8a}

2. executing external native build for cmake

Error:A problem occurred configuring project ':app'.> executing external native build for cmake E:\csy\GitDev\jni\jni-encrypt\EncryptUtils\app\src\main\jni\CMakeLists.txt

 src/main/jni/des/des.csrc/main/jni/des/des_util.c

改成

des/des.cdes/des_util.c

image.png

参照:http://www.voidcn.com/article/p-bewlnjij-sn.html

3.Error:(167, 6) error: conflicting types for 'arrayCryption'

没有引入头文件

Error:(167, 6) error: conflicting types for 'arrayCryption'Information:(164, 5) previous implicit declaration is hereWarning:(174, 9) warning: implicit declaration of function 'LoopF' is invalid in C99 [-Wimplicit-function-declaration]Warning:(179, 5) warning: implicit declaration of function 'Bit64ToByte' is invalid in C99 [-Wimplicit-function-declaration]Error:(182, 6) error: conflicting types for 'Bit64ToByte'Information:(179, 5) previous implicit declaration is hereError:(192, 6) error: conflicting types for 'LoopF'Information:(174, 9) previous implicit declaration is hereInformation:(143, 9) previous implicit declaration is hereWarning:(143, 9) warning: implicit declaration of function 'leftMoveKey' is invalid in C99 [-Wimplicit-function-declaration]Warning:(164, 5) warning: implicit declaration of function 'arrayCryption' is invalid in C99 [-Wimplicit-function-declaration]Error:(167, 6) error: conflicting types for 'arrayCryption'Information:(164, 5) note: previous implicit declaration is hereWarning:(174, 9) warning: implicit declaration of function 'LoopF' is invalid in C99 [-Wimplicit-function-declaration]Warning:(179, 5) warning: implicit declaration of function 'Bit64ToByte' is invalid in C99 [-Wimplicit-function-declaration]Error:(182, 6) error: conflicting types for 'Bit64ToByte'Information:(179, 5) note: previous implicit declaration is hereError:(192, 6) error: conflicting types for 'LoopF'Information:(174, 9) note: previous implicit declaration is hereError:(223, 6) error: conflicting types for 'leftMoveKey'Information:(143, 9) note: previous implicit declaration is here
add_library( # Sets the name of the library.             encrypt             # Sets the library as a shared library.             SHARED             # Provides a relative path to your source file(s).             des/des.c             des/des_util.c             des/com_jinlin_encryptutils_des_DES.h             des/des              )

如上新增des/com_jinlin_encryptutils_des_DES.h

或者未在头文件中声明方法

{RSG5410}9TB%_B}3TGMN3B.png

4.如何引入其它C文件,把其它C文件的方法在相应的头文件声明,然后引入相关的头文件即可


5.给jni方法指定Android.mk或者CMakeLists.txt

参照官方文档:https://developer.android.com/studio/projects/add-native-code.html

将 Gradle 关联到您的原生库
要将 Gradle 关联到您的原生库,您需要提供一个指向 CMake 或 ndk-build 脚本文件的路径。在您构建应用时,Gradle 会以依赖项的形式运行 CMake 或 ndk-build,并将共享的库打包到您的 APK 中。Gradle 还使用构建脚本来了解要将哪些文件添加到您的 Android Studio 项目中,以便您可以从 Project 窗口访问这些文件。如果您的原生源文件没有构建脚本,则需要先创建 CMake 构建脚本,然后再继续。
将 Gradle 关联到原生项目后,Android Studio 会更新 Project 窗格以在 cpp 组中显示您的源文件和原生库,在 External Build Files 组中显示您的外部构建脚本。
:更改 Gradle 配置时,请确保通过点击工具栏中的 Sync Project 应用更改。此外,如果在将 CMake 或 ndk-build 脚本文件关联到 Gradle 后再对其进行更改,您应当从菜单栏中选择 Build > Refresh Linked C++ Projects,将 Android Studio 与您的更改同步。
使用 Android Studio UI
您可以使用 Android Studio UI 将 Gradle 关联到外部 CMake 或 ndk-build 项目:
从 IDE 左侧打开 Project 窗格并选择 Android 视图。
右键点击您想要关联到原生库的模块(例如 app 模块),并从菜单中选择 Link C++ Project with Gradle。您应看到一个如图 4 所示的对话框。
从下拉菜单中,选择 CMakendk-build。如果您选择 CMake,请使用 Project Path 旁的字段为您的外部 CMake 项目指定 CMakeLists.txt
脚本文件。
如果您选择 ndk-build,请使用 Project Path 旁的字段为您的外部 ndk-build 项目指定 Android.mk
脚本文件。如果 Application.mk
文件与您的 Android.mk
文件位于相同目录下,Android Studio 也会包含此文件。

图 4. 使用 Android Studio 对话框关联外部 C++ 项目。

点击 OK

手动配置 Gradle
要手动配置 Gradle 以关联到您的原生库,您需要将 externalNativeBuild {}
块添加到模块级 build.gradle
文件中,并使用 cmake {}
或 ndkBuild {}
对其进行配置:
android { … defaultConfig {…} buildTypes {…} // Encapsulates your external native build configurations. externalNativeBuild { // Encapsulates your CMake build configurations. cmake { // Provides a relative path to your CMake build script. path “CMakeLists.txt” } }}
:如果您想要将 Gradle 关联到现有 ndk-build 项目,请使用 ndkBuild {}
块而不是 cmake {}
,并提供 Android.mk
文件的相对路径。如果 Application.mk
文件与您的 Android.mk
文件位于相同目录下,Gradle 也会包含此文件


博客CSDN
微信公众号
我的简书
我的GitHub,麻喜欢的话给个star吧