我尝试使用Djinni来实现用于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;
}当我试图为编译它时,它会抛出以下错误:
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返回自定义记录的示例,或者遇到了相同的问题?
发布于 2019-04-29 06:46:11
缺少的函数应该生成到NativeAudioBook.cpp中。确保在构建规则中包含了该文件。
发布于 2019-04-30 09:06:06
我忘了包括生成的..hpp文件。我的CMakeLists.txt只包含生成的cpp文件,但没有包含任何hpp头文件。因为Djinni只为定义的常量生成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的提示
https://stackoverflow.com/questions/55892541
复制相似问题