如何在c ++中用另一个替换成员对象

时间:2014-03-03 22:45:27

标签: java c++ struct java-native-interface

我想在c ++中为成员变量分配一个特定的结构,但是我的尝试失败了。在一些测试之后,我认识到在分配之后变量不保持传递的对象,而是隐式调用复制构造函数并将值复制到新对象。是不是可以用c ++覆盖对象变量?

现在详细情况:

我在c ++方面没有太多经验,但由于尝试为现有的小c库手动创建jni包装器,因此必须编写一些c ++代码。我通过java端的代理类实现它,它只包含c ++对应的地址和重定向方法调用。该库由许多结构组成,我为其编写了java类。成员的分配和访问是通过java端的getter和setter实现的。

//C-lib code

struct A {
   int testVal;
   ...  
}

struct B{
   struct A a;
   ...
}

我有两个结构。而第一个包含一些不重要的代码,第一个结构的成员的第二个sonsist。

//java proxy classes

public class A{
   private long ADRESS;

   public native int getTestVal();
   public native void setTestVal(int testVal);
   ...
}

public class B{
   private long ADRESS;

   public native A getA();
   public native void setA(A a);
   ...
}

java副本中唯一的变量是长持有地址,通过getter和setter方法提交对b中内部结构的访问。代码字native声明该方法是在本机代码中实现的。

//java test class

public class Test{

   public static void main(String[] args){

      A a = new A();
      B b = new B();
      b.setA(a);
   }
}

我写了一个java测试类来检查分配是否成功。

//JNI interface method for setA 

   JNIEXPORT void JNICALL ..._setA
    (JNIEnv *env, jobject java_b, jobject java_a){

        B *b = getBoundObject<B>(env, java_b);
        A *a = getBoundObject<A>(env, java_a);

        a->testVal = 999;
        b->a = *a;
        printf("\nBEFORE ASSIGNMENT %i | %i\n", a->testVal, b->a.testVal);

        b->a.testVal = 200;
        printf("\nAFTER ASSIGMENT  %i | %i\n", a->testVal, b->a.testVal);

}

jni接口实现了c库和java代码之间的层。它是用c ++编写的。 testVal变量表示一个变量,我刚用它来检查对象是否相同。 printf调用的输出如下所示:

#C-site:在分配之前999 | 999

#C-site:999之后的分配| 200

是不是有办法真正将对象分配给变量而不是仅复制值?这很重要,因为对象仍然在java端使用。 建议?

1 个答案:

答案 0 :(得分:1)

对我来说,你需要使用指针。无论何时分配对象,都会调用复制构造函数将所有内容复制到新对象中。如果使用指针,则不应分配任何新内容。

因此,你的struct B应该保留一个指向A而不是A对象的指针。然后,您的setA()参数应为setA(A* a)