我可以在Android应用程序上构建一个c ++类吗?

时间:2016-07-12 14:31:34

标签: android android-studio java-native-interface

我在Android应用程序中看到了很多本机代码的教程, 并且总是proggramers在从java代码调用它之前将“extern c”置于函数周围。

我的问题是我是否可以构建一个c ++类并直接从java代码中使用它。

例如,它是我简单的cpp代码:

#ifndef NATIVEEX_MYNUMBER_H
#define NATIVEEX_MYNUMBER_H

class MyNumber
{
public:
    MyNumber();

    int getNum();

private:
    int num;
};

#endif //NATIVEEX_MYNUMBER_H

是否可以从java做“new MyNumber()”?

1 个答案:

答案 0 :(得分:0)

您可以在JNI中使用C ++。

然而, 可以将C ++对象与Java对象结合使用。 JVM没有为此设置。因此,在JNI中,您将获得对Java对象的引用,而不是C ++对象,并且您的C ++代码对此进行操作。请记住,JNI代码仍然在Java / JVM环境中运行,因此您的本机C ++代码必须尊重它。

现在,这并不意味着您仍然无法在JNI中使用C ++类。你无法将它们自由地来回传递给JVM。

extern "C"指令用于防止在C ++编译和链接中发生的事件,称为 name mangling 。 C ++使用名称修改来支持使用不同参数类型的方法重载。

需要禁用名称修改以保留外部库中的函数名称,以便JVM可以链接到它。不通过JNI调用的函数不需要extern "C"包装器。

同样,C ++异常不能直接通过JNI抛出。需要捕获和处理所有C ++异常,这可能意味着创建Java异常并调用JNIEnv throwNew方法。

此处的详细信息:Name Mangling and extern “C” in C++ - GeeksforGeeks