![](/img/trans.png)
[英]Create a C++ class and Use that class In Another C++ Class Which contain JNI methods in ndk android
[英]Use a simple c++ class in Android NDK
我正在尝试学习Android NDK的基础知识,但是当我必须在c ++类中使用它时,我就陷入了困境。
我理解如何使用一个简单的函数,但我该怎么做才能操作c ++类的字段和方法?
我正在尝试使用这个简单的c ++类:
#include <cstdlib>
#include <jni.h>
using namespace std;
class Point {
int x, y; // coordonnées du point
public:
Point() {
this->x = 0;
this->y = 0;
}
Point(int x, int y) {
this->x = x;
this->y = y;
}
int getX() const {
return x;
}
int getY() const {
return y;
}
Point symetrique() const {
return Point(-x, -y);
}
bool operator ==(const Point &p) const {
return this->x == p.getX() && this->y == p.getY();
}
};
extern "C" {
JNIEXPORT jlong JNICALL Java_com_example_jnipoint_JPoint_createPoint__
(JNIEnv *, jobject);
JNIEXPORT jlong JNICALL Java_com_example_jnipoint_JPoint_createPoint__II
(JNIEnv *, jobject, jint, jint);
JNIEXPORT jint JNICALL Java_com_example_jnipoint_JPoint_nativeGetX
(JNIEnv *, jobject, jlong);
JNIEXPORT jint JNICALL Java_com_example_jnipoint_JPoint_nativeGetY
(JNIEnv *, jobject, jlong);
JNIEXPORT jlong JNICALL Java_com_example_jnipoint_JPoint_nativeSymetrique
(JNIEnv *, jobject, jlong);
};
JNIEXPORT jlong JNICALL Java_com_example_jnipoint_JPoint_createPoint__(JNIEnv* env, jobject thiz) {
return (jlong)(new Point());
}
JNIEXPORT jlong JNICALL Java_com_example_jnipoint_JPoint_createPoint__II(JNIEnv* env, jobject thiz, jint x, jint y) {
return (jlong)(new Point(x, y));
}
JNIEXPORT jint JNICALL Java_com_example_jnipoint_JPoint_nativeGetX(JNIEnv* env, jobject thiz, jlong nativePointer) {
return ((Point*)nativePointer)->getX();
}
JNIEXPORT jint JNICALL Java_com_example_jnipoint_JPoint_nativeGetY(JNIEnv* env, jobject thiz, jlong nativePointer) {
return ((Point*)nativePointer)->getY();
}
jlong Java_com_example_jnipoint_JPoint_nativeSymetrique(JNIEnv* env, jobject thiz, jlong nativePointer) {
return ((Point*)nativePointer)->symetrique();
}
我试图找到样本但到目前为止没什么......也许我没有使用正确的关键字
*更新*
我为c ++ Point类创建了一个Java包装器,并添加到c ++文件JNI方法中。 代码如下:
public class JPoint {
private long nativePointer;
public JPoint() {
nativePointer = createPoint();
}
public JPoint(int x, int y) {
nativePointer = createPoint(x, y);
}
public int getX() {
return nativeGetX(nativePointer);
}
public int getY() {
return nativeGetY(nativePointer);
}
public JPoint symetrique() {
JPoint tmp = new JPoint();
tmp.nativePointer = nativeSymetrique(nativePointer);
return tmp;
}
// TODO
/*public boolean equals(Object o) {
return nativeEquals(o);
}*/
private native long createPoint(); // Void constructor
private native long createPoint(int x, int y);
private native int nativeGetX(long nativePointer);
private native int nativeGetY(long nativePointer);
private native long nativeSymetrique(long nativePointer);
//private native boolean nativeEquals(Object p); TODO
}
现在我被NativeSymetrique函数所困,它说我不能将'Point'转换为'jlong'。 谁可以帮我这个事 ? 谢谢
*更新2 *
SWIG解决了我的问题,你不必手写包装器,它似乎是大型库的一个很好的选择。
看看JNA 。
JNI旨在从C访问Java类/对象。这意味着JNI为您提供了访问JVM的C函数。 但是反之亦然:从JVM访问C结构(C ++类)。 Java没有这样的方法。 因此,如果您希望在C ++和Java之间进行“类反射”,那么您唯一能做的就是在Java端使用类和一组JNI C调用来访问,修改和调用Java对象上的方法。 Java端的JNI本机方法对您没有用处,因为它可以采用的唯一参数(in或out)可以只是Java对象(或基元或数组)。 根本没有办法将C(++)结构/对象传递给Java端。
您可以根据需要使用C代码进行操作并通过JNI传递\\返回值,您可以在androidndk / samples中找到JNI样本 - helloJni。
例如:
JNIEXPORT jfloat JNICALL Java_com_opengl_glworld_GLWorldRenderer_changeCurrentArea(JNIEnv *env, jobject obj, jfloat curArea)
{
area = curArea;
return area;
// here you can execude you C code, you can access to methods of class,
// or method that use your classes.
}
正如我在第二次更新中所说, SWIG完全符合我的需求。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.