【问题标题】:C++ JNI interoperabilityC++ JNI 互操作性
【发布时间】:2013-02-21 22:00:31
【问题描述】:

在对这些论坛进行了彻底搜索后,无法找到相关答案;我决定问你,StackOverflow 的好心人我的问题。

我目前有 3 个 (C++) 库:

  • StaticLib(包含纯虚拟接口和“C”风格原型)

  • DynamicLibLinux(包含上述原型的 Linux 实现)

  • DynamicLibAndroid(不知道在这里放什么)

问题是,我不想更改 StaticLib 的代码:

struct IObject {
 virtual ~IObject() {}
 virtual void foo() = 0;
};

extern "C" { 
 IObject* CreateObject();
}

DynamicLibLinux 包含

#include <IObject.h>
class Object : public IObject {
public:
 virtual ~Object() {}
 virtual void foo() {
  //do something incredibly useful here...
 }
};

#ifdef __cplusplus
extern "C" {
#endif
IObject* CreateObject() {
 return new Object;
}
#ifdef __cplusplus
}
#endif

之后,在我的 linux 独立版中,我可以调用 dlsym("libDynamicLibLinux.so") 函数来加载我的 CreateObject 函数。这一切都像一个魅力。现在,事情是这样的:我也想在 Android 应用程序中使用静态库。而且我不知道如何在 JNI 中实现这一点。到目前为止,我有这样的事情:

#include <IObject.h>
#include <jni.h>
class Object : public IObject {
... same as above
};

#ifdef ...
JNIEXPORT IObject* JNICALL CreateObject(JNIEnv*) {
 return new Object;
}

显然,这将不起作用,因为实现与声明不匹配。所以我的问题归结为:

有什么方法可以将 C++ 静态库“按原样”与 JNI 一起使用?

诚挚的问候,感谢您的耐心等待,

埃米尔

编辑: 与此同时,我发现了一些有希望的东西:javacpp。这里有人有使用这个库的经验吗?

【问题讨论】:

  • 您是想从 C++ 调用 Java,还是从 Java 调用 C++?
  • 不知道对你有没有帮助,但是我做了一个使用jni的教程。 julien-dumortier.fr/android-ndk-faire-du-c-avec-android对不起我的英语。可能我没看懂问题!
  • 我正在尝试从 Java 调用 C++。
  • 我不明白这个问题。静态库必须在构造时静态链接到两者 Android 和 Linux 特定的 DLL。
  • @EJP:这就是问题所在,如果我想实现静态库头中定义的纯虚拟;实现细节(返回类型、参数等)需要兼容。 JNI 阻止我这样做。

标签: android c++ java-native-interface shared-libraries static-libraries


【解决方案1】:

我不确定我是否了解您的系统是如何工作的,但是像这样的界面应该可以与 JavaCPP 一起使用:

@Platform(include="IObject.h",link="DynamicLib")
public class DynamicLib {
    public static class IObject extends Pointer {
        public native void foo();
    }
    public static native IObject CreateObject();
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多