我在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()”?
答案 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
方法。