首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Djinni从C++调用javacallback

Djinni从C++调用javacallback
EN

Stack Overflow用户
提问于 2020-06-23 15:46:12
回答 2查看 222关注 0票数 1

我正在尝试从C++调用java。我已经理解了这个答案的重点,但我觉得我无法完成最后一英里。What classes and methods do I have to use to call Java from C++?

也没有足够的点数在那里发表评论。基本上,我从java中创建了对象,并将其传递到C++中。然后我得到我可以潜在地缓存它或立即调用到回调中。

下面是我的djinni文件的样子

代码语言:javascript
复制
my_client_interface = interface +j {
    log_string(str: string): bool;
}

get_my_record = interface +c {
  static create(): get_my_record;
  method_returning_nothing(value: i32);
  add_to_string(value: string);
  method_returning_something(key: my_record): my_record;
  set_callback(cb: my_client_interface);
}

我可以创建和传递来自java的记录器回调,但是我要针对哪个具体的类调用记录器。

代码语言:javascript
复制
void GetMyRecordImpl::set_callback(const std::shared_ptr<MyClientInterface> & cb)
{
    cb->???????
}

因为MyClientInterface仍然是抽象的,所以它的错误很明显

代码语言:javascript
复制
error: member access into incomplete type 'std::__ndk1::shared_ptr<helloworld::MyClientInterface>::element_type' (aka 'helloworld::MyClientInterface')

但是如果我针对它实现一个具体的类,显然它将调用具体的类log方法,而不是java中的方法。我确实看到了我所需要的

代码语言:javascript
复制
bool NativeMyClientInterface::JavaProxy::log_string(const std::string & c_str) {
  auto jniEnv = ::djinni::jniGetThreadEnv();
  ::djinni::JniLocalScope jscope(jniEnv, 10);
  const auto& data = ::djinni::JniClass<::djinni_generated::NativeMyClientInterface>::get();
  auto jret = jniEnv->CallBooleanMethod(Handle::get().get(), data.method_logString,
                                      ::djinni::get(::djinni::String::fromCpp(jniEnv, c_str)));
  ::djinni::jniExceptionCheck(jniEnv);
  return ::djinni::Bool::toCpp(jniEnv, jret);
}

但是,如何从指向抽象类MyClientInterface的shared_pointer创建所需的NativeMyClientInterface对象呢?

EN

回答 2

Stack Overflow用户

发布于 2020-06-23 16:30:02

我没有包括#include "my_client_interface.hpp“:|这个错误现在很有意义了。

票数 1
EN

Stack Overflow用户

发布于 2020-06-23 17:30:28

如果希望在C++代码中使用Java对象,则必须用Java语言实现和实例化该对象。Djinni可以被视为Java本机接口(Java Native Interface,JNI)代码生成器。你需要的是Java应用程序,这些部分是用C++实现的。

在Djinni中声明的每个接口都是为C++和Java (或Objective-C)生成的,因此必须有两个实现的类。一个是由Djinni生成的,它是一个允许跨语言通信的代理。另一个必须由程序员实现。

关于您的编译错误,我相信您在定义GetMyRecordImpl的文件中缺少一个include指令,如下所示:

代码语言:javascript
复制
#include "generated/MyClientInterface.hpp"
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62529815

复制
相关文章

相似问题

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