我正在尝试从C++调用java。我已经理解了这个答案的重点,但我觉得我无法完成最后一英里。What classes and methods do I have to use to call Java from C++?
也没有足够的点数在那里发表评论。基本上,我从java中创建了对象,并将其传递到C++中。然后我得到我可以潜在地缓存它或立即调用到回调中。
下面是我的djinni文件的样子
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的记录器回调,但是我要针对哪个具体的类调用记录器。
void GetMyRecordImpl::set_callback(const std::shared_ptr<MyClientInterface> & cb)
{
cb->???????
}因为MyClientInterface仍然是抽象的,所以它的错误很明显
error: member access into incomplete type 'std::__ndk1::shared_ptr<helloworld::MyClientInterface>::element_type' (aka 'helloworld::MyClientInterface')但是如果我针对它实现一个具体的类,显然它将调用具体的类log方法,而不是java中的方法。我确实看到了我所需要的
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对象呢?
发布于 2020-06-23 16:30:02
我没有包括#include "my_client_interface.hpp“:|这个错误现在很有意义了。
发布于 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指令,如下所示:
#include "generated/MyClientInterface.hpp"https://stackoverflow.com/questions/62529815
复制相似问题