Android studio用Java编写项目,导入外部库.so和.h,.h被项目.class源文件识别不了,.h里的关键字引用不了,.so和.h是通过Android studio里的cmakelists.txt引入的,编译已经通过。这个问题怎么解决?请大家给点思路,谢谢!
参考GPT和自己的思路:这种情况下,通常是因为.h头文件没有在项目中正确地导入或者配置。您可以通过以下几种方式来尝试解决这个问题:
1.检查.h文件是否被正确地放置在项目中,并且是否在头文件夹下。
2.检查编译器是否能够找到.h文件,需要确认.h文件的路径和文件名是否与导入时的路径和文件名一致。
3.检查.h文件中的头文件引用顺序和.h文件列表是否正确,必须按照正确的顺序包含头文件。
4.最后,尝试重新构建项目,使导入.so和.h文件的cmakelists.txt能够正确导入它们。
你提的这个问题,其实是android调用c/c++库的问题。如果是外部导入的so库,.h文件只是用来参考,看看函数的格式。你可以使用jna的方式来调用。具体参考:
https://blog.csdn.net/werewolf2017/article/details/88426341
另外还有一种是通过jni的方式,但要求你对c/c++比较熟悉才行。流程是先用java写好函数接口,然后调用javah编译生成.h文件,然后用c/c++实现并编译成so库。这个方法在你本问题中不太适用。
如果在Android Studio项目中导入外部库.so和.h文件后,.h文件被项目源文件无法识别,可能需要进行以下几个步骤来解决:
include_directories(path/to/header/files)
其中,path/to/header/files是.h文件所在的路径。这将告诉CMake编译器在编译时查找.h文件。
android {
...
sourceSets {
main {
jniLibs.srcDirs = ['path/to/so/files']
jni.srcDirs = ['path/to/header/files']
}
}
}
其中,path/to/header/files是.h文件所在的路径。这将告诉Android Studio在编译时查找.h文件。
检查.h文件的语法:如果在项目中仍然无法识别.h文件,请检查.h文件的语法是否正确。如果.h文件中存在语法错误,它将无法被正确编译并识别。
检查.h文件中的关键字:如果在.h文件中的关键字无法被识别,请检查.h文件中是否存在错误的关键字。你可以使用其他代码编辑器打开.h文件并检查其语法。
如果以上步骤无法解决问题,请进一步检查项目中的其他设置,例如Android Studio的NDK路径设置等。你可以参考Android Studio官方文档中的相关内容来解决问题。
导入了资源要将资源配置到CMakeLists.txt文件才能进行使用。
导入头文件:
include_directories("inc")
批量导入.c .h .cpp文件:
#批量查询到.c .h .cpp文件
file(GLOB allCpp *.c *.h *.cpp *.hpp)
add_library( # Sets the name of the library.
qq_sounddemo
# Sets the library as a shared library.
SHARED
# Provides a relative path to your source file(s).
${allCpp})//将这些文件导入到qq_sounddemo里面去
设置库文件路径,就是要链接到的so文件路径:
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -L${CMAKE_SOURCE_DIR}/../jniLibs/${CMAKE_ANDROID_ARCH_ABI}")
链接具体的库到qq_sounddemo.so里面去,不然使用会报错:找不到对应的库:
target_link_libraries( # Specifies the target library.
qq_sounddemo
# Links the target library to the log library
# included in the NDK.
${log-lib}
fmod
fmodL
)
以上工作就是对第三方库的导入和配置。