C ++ Джинни вернуть запись.Неопределенная ссылка на djinni_generated - PullRequest
1 голос
/ 28 апреля 2019

Я пытаюсь использовать Джинни для реализации разделяемой бизнес-логики для Android и iOS.Я продолжаю получать сообщение об ошибке для метода, который возвращает пользовательскую запись.Я использую следующее определение и реализацию IDL.

audio_book.djinni

audio_book = record {
    id: i32;
    title: string;
}

audio_book_service = interface +c {
    static create(): audio_book_service;
    fetch_audio_book(id: i32): audio_book;
}

, в результате которого были созданы следующие файлы:

audio_book.hpp

#pragma once

#include <cstdint>
#include <string>
#include <utility>

struct AudioBook final {
    int32_t id;
    std::string title;

    AudioBook(int32_t id_,
              std::string title_)
    : id(std::move(id_))
    , title(std::move(title_))
    {}
};

audio_book_service.hpp

#pragma once

#include <cstdint>
#include <memory>

struct AudioBook;

class AudioBookService {
public:
    virtual ~AudioBookService() {}

    static std::shared_ptr<AudioBookService> create();

    virtual AudioBook fetch_audio_book(int32_t id) = 0;
};

с моей реализацией:

audio_book_service_impl.h

#pragma once

#include <iostream>

#include "audio_book_service.hpp"
#include "audio_book.hpp"

class AudioBookServiceImpl : public AudioBookService {

public:
   AudioBook fetch_audio_book(int32_t id) override ;
};

audio_book_service_impl.cpp

#include "audio_book_service_impl.h"

std::shared_ptr<AudioBookService> AudioBookService::create() {
    return std::make_shared<AudioBookServiceImpl>();
}

AudioBook AudioBookServiceImpl::fetch_audio_book(int32_t id) {
    AudioBook audioBook(1, "TEST");
    return audioBook;
}

Когда я пытаюсь скомпилировать его для Android-проекта, он выдаст эту ошибку:

app/src/djinni/generated/jni/NativeAudioBookService.cpp:38: error: undefined reference to 'djinni_generated::NativeAudioBook::fromCpp(_JNIEnv*, lynen::AudioBook const&)'
  clang++: error: linker command failed with exit code 1 (use -v to see invocation)
  ninja: build stopped: subcommand failed.

Почему он говорит, что он не определен?Для нативных типов компилируется без проблем.У кого-нибудь есть пример возврата пользовательских записей в джиннах или возникла такая же проблема?

Ответы [ 2 ]

1 голос
/ 29 апреля 2019

Отсутствующая функция должна была быть сгенерирована в NativeAudioBook.cpp. Убедитесь, что вы включили этот файл в свои правила сборки.

0 голосов
/ 30 апреля 2019

Я забыл включить сгенерированные .hpp-файлы.Мой CMakeLists.txt содержал только сгенерированные cpp-файлы, но не заголовки hpp.Поскольку Джинни генерирует cpp только для определенных констант.Что касается интерфейсов и записей, djinni генерирует hpp-файлы.

Вот мой CMakeLists.txt, который исправил проблему:

cmake_minimum_required(VERSION 3.4.1)

set(support_dir src/djinni/support-lib/jni)

set(include_dirs src/djinni/generated/cpp/ src/djinni/generated/jni/ src/main/cpp/)

file(
    GLOB_RECURSE support_srcs
    ${support_dir}/*.cpp)

file(
    GLOB_RECURSE lib_srcs
    src/djinni/generated/cpp/*.cpp
    src/djinni/generated/cpp/*.hpp // forgot to include. This fixed the issue.
    src/djinni/generated/jni/*.cpp
    src/main/cpp/*.cpp)

set(complete_src ${support_srcs} ${lib_srcs})

add_library(lynen-shared SHARED ${complete_src})

target_include_directories(
    lynen-shared
    PUBLIC
    ${include_dirs}
    ${support_dir})

Спасибо @atwyman, @mkk за подсказку.

...