最近在之前老项目中进行NDK开发,发现在Android Studio中编写C代码时候,编译器没有自动补全的提示,很蛋疼,于是研究通过以下方法成功解决: 1、创建完成jni目录,生成.h文件及创建.c文件 2、rebuild项目,生成Android.mk文件 Android.mk文件内容如下:
LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := app LOCAL_LDFLAGS := -Wl,--build-id LOCAL_SRC_FILES := \ F:\practice\NDKTest\app\src\main\jni\ndk_file_patch.c \ LOCAL_C_INCLUDES += F:\practice\NDKTest\app\src\debug\jni LOCAL_C_INCLUDES += F:\practice\NDKTest\app\src\main\jni include $(BUILD_SHARED_LIBRARY)再新建的.c文件关联可在LOCAL_SRC_FILES下添加路径即可,或者重新rebuild自动关联路径。
如图,Android.mk文件位于app->build->intermediates->ndk目录下 此时rebuild会报如下错误: 暂不用理会,继续下一步骤。 3、切换为Android工程,右键项目–>Link C++ Project with Gradle 选择之后会弹出集成ndk的选择框: 此处我选择ndk-build的方式,下方路径选择步骤2中的Android.mk文件。
点击ok之后,会在.gradle文件中增加如下配置: 此时再编写.c文件,便有c函数自动补全的提示: 至此,AS中C代码无法自动补全的问题已成功解决! 如果是新建项目,可以在创建项目时勾选include C/C++。
另外,再记录一个报错问题: 错误信息: Caused by: java.lang.UnsatisfiedLinkError: dalvik.system.PathClassLoader[DexPathList[[zip file “/data/app/sz.com.myjni-1/base.apk”],nativeLibraryDirectories=[/data/app/sz.com.myjni-1/lib/arm64, /data/app/sz.com.myjni-1/base.apk!/lib/arm64-v8a, /system/lib64, /vendor/lib64]]] couldn’t find “libndk_file_patch.so” 这是由于Java代码动态加载.so库找不到而报的错,动态加载.so代码:
static { System.loadLibrary("ndk_file_patch"); }所以,还需在gradle中指定编译出.so文件的名字(默认为工程app module名称): UnsatisfiedLinkError即解决!