首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++ Djinni返回记录。对djinni_generated的未定义引用

C++ Djinni返回记录。对djinni_generated的未定义引用
EN

Stack Overflow用户
提问于 2019-04-28 16:53:00
回答 2查看 387关注 0票数 1

我尝试使用Djinni来实现用于Android和iOS的共享业务逻辑。对于返回自定义记录的方法,我一直得到一个错误。我使用以下IDL-定义和实现。

audio_book.djinni

代码语言:javascript
复制
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

代码语言:javascript
复制
#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

代码语言:javascript
复制
#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

代码语言:javascript
复制
#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

代码语言:javascript
复制
#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;
}

当我试图为编译它时,它会抛出以下错误:

代码语言:javascript
复制
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.

为什么ist说它是未定义的?对于本机类型,它没有问题地编译。有谁有用djinni返回自定义记录的示例,或者遇到了相同的问题?

EN

回答 2

Stack Overflow用户

发布于 2019-04-29 06:46:11

缺少的函数应该生成到NativeAudioBook.cpp中。确保在构建规则中包含了该文件。

票数 1
EN

Stack Overflow用户

发布于 2019-04-30 09:06:06

我忘了包括生成的..hpp文件。我的CMakeLists.txt只包含生成的cpp文件,但没有包含任何hpp头文件。因为Djinni只为定义的常量生成cpp。对于接口和记录,djinni生成hpp-文件。

下面是我的CMakeLists.txt修复了这个问题:

代码语言:javascript
复制
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的提示

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55892541

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档