Android studio用Java写项目,导入外部库.so和.h,.h被项目.class源文件识别不了

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文件被项目源文件无法识别,可能需要进行以下几个步骤来解决:

  1. 确认.h文件已经包含在cmakelists.txt文件中:请确保你已经在cmakelists.txt文件中包含了.h文件。你可以使用以下语句来包含.h文件:
include_directories(path/to/header/files)

其中,path/to/header/files是.h文件所在的路径。这将告诉CMake编译器在编译时查找.h文件。

  1. 添加.h文件路径到项目中:如果在cmakelists.txt文件中已经包含了.h文件,但是在项目中仍然无法识别,请尝试将.h文件路径添加到项目中。你可以在项目的build.gradle文件中添加以下语句:
android {
    ...
    sourceSets {
        main {
            jniLibs.srcDirs = ['path/to/so/files']
            jni.srcDirs = ['path/to/header/files']
        }
    }
}

其中,path/to/header/files是.h文件所在的路径。这将告诉Android Studio在编译时查找.h文件。

  1. 检查.h文件的语法:如果在项目中仍然无法识别.h文件,请检查.h文件的语法是否正确。如果.h文件中存在语法错误,它将无法被正确编译并识别。

  2. 检查.h文件中的关键字:如果在.h文件中的关键字无法被识别,请检查.h文件中是否存在错误的关键字。你可以使用其他代码编辑器打开.h文件并检查其语法。

如果以上步骤无法解决问题,请进一步检查项目中的其他设置,例如Android Studio的NDK路径设置等。你可以参考Android Studio官方文档中的相关内容来解决问题。

  • 建议你看下这篇博客👉 :Android Studio执行Java类的main方法及解决方法
  • 除此之外, 这篇博客: Android Studio引入JNI第三方库中的 CMakeLists.txt配置 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 导入了资源要将资源配置到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
            )
    

    以上工作就是对第三方库的导入和配置。