92742


Android StudioにてCmakeを用いてCのソースコードを導入したいのですが、Runをすると下記のエラーが出てしまいます。  
ライブラリとしてJava/Kotlinから呼びたいのはmain.cppです。  
初歩的な質問で申し訳ありませんが、よろしければご教授いただきたく。  
環境:

  * OS: Windows10
  * Android Studio: Chipmunk 2021.2.1. Patch 1

ファイル構成

  * main.cpp
  * a.cpp
  * a.h

エラー内容:

[code]

    C/C++: ../../../../src/main/cpp/main.cpp:16: error: undefined reference to 'a()'
    
[/code]

main.cpp

[code]

    #include <jni.h>
    #include "a.h"
    
    extern "C"
    JNIEXPORT void JNICALL
    Java_com_example_clibtest_MainActivity_main(JNIEnv *env, jobject thiz) {
        a();
    }
    
[/code]

a.cpp

[code]

    #include <jni.h>
    extern "C" JNIEXPORT void
    a(){
    }
    
[/code]

a.h

[code]

    #ifndef CLIBTEST_A_H
    #define CLIBTEST_A_H
    
    
    extern void a();
    
    #endif //CLIBTEST_A_H
    
[/code]

CMakeLists.txt

[code]

    cmake_minimum_required(VERSION 3.4.1)    
    
    add_library(a SHARED src/main/cpp/a.cpp)
    add_library(main SHARED src/main/cpp/main.cpp)
    
    target_link_libraries(
            main
            a
            android
            log)
    
    
    include_directories(src/main/cpp/)
    
[/code]


CC BY-SA 4.0
2022-12-13T08:01:58.847
92740
2022-12-13T09:03:13.857
2022-12-13T09:03:13.857
3060
32622
question
android c++ c cmake
Android StudioでのCmakeの書き方について


C/C++関数`a`をJava/Kotlin層に直接公開したいのでなければ、`extern "C"`や`JNIEXPORT`は不要です。

a.cpp

[code]

    #include <a.h>
    void a(){
      //(実装)
    }
    
[/code]

`add_library`で構成する共有ライブラリ（≒Java/Kotlin層からロードする実体）は1つで十分なはずです。同共有ライブラリを構成するソースコード群は第3引数以降に全て記述します。

CMakeLists.txt

[code]

    add_library(main SHARED
      src/main/cpp/main.cpp
      src/main/cpp/a.cpp)
    
    target_link_libraries(
            main
            android
            log)
    
[/code]


CC BY-SA 4.0
2022-12-13T08:17:52.200
92742
2022-12-13T08:17:52.200
49
92740
answer