最近在之前老项目中进行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即解决!