Estou utilizando uma DLL e seu metodos com java, mas um dos metodos é necessario passar argumentos por ref para recuperar os dados apos a chamada do metodo.
Segue abaixo exemplo do codigo em C#:
ints=20;byte[]b=newbyte[21];sName(b,refs); // << esse é o metodoreturnSystem.Text.Encoding.ASCII.GetString(b,0,s-1);
tentei fazer da seguinte forma em java:
ints=20;byte[]b=newbyte[21];GetPlayerName(b,s);
Mas ao executar recebo uma mensaguem de acesso violado na dll.
Como posso passar objetos em java por ref como faço em C#.?
Olá, Boa noite!
Tentei criar um Wrapper mas n deu certo... segue codigo abaixo:
publicclassMutableIntextendsNumberimplementsComparable,Mutable{/** * Required for serialization support. * * @see java.io.Serializable */privatestaticfinallongserialVersionUID=512176391864L;/** The mutable value. */privateintvalue;/** * Constructs a new MutableInt with the default value of zero. */publicMutableInt(){super();}/** * Constructs a new MutableInt with the specified value. * * @param value * a value. */publicMutableInt(intvalue){super();this.value=value;}/** * Constructs a new MutableInt with the specified value. * * @param value * a value. * @throws NullPointerException * if the object is null */publicMutableInt(Numbervalue){super();this.value=value.intValue();}//-----------------------------------------------------------------------/** * Gets the value as a Integer instance. * * @return the value as a Integer */publicObjectgetValue(){returnnewInteger(this.value);}/** * Sets the value. * * @param value * the value to set */publicvoidsetValue(intvalue){this.value=value;}/** * Sets the value from any Number instance. * * @param value * the value to set * @throws NullPointerException * if the object is null * @throws ClassCastException * if the type is not a {@link Number} */publicvoidsetValue(Objectvalue){setValue(((Number)value).intValue());}//-----------------------------------------------------------------------/** * Increments the value. * * @since Commons Lang 2.2 */publicvoidincrement(){value++;}/** * Decrements the value. * * @since Commons Lang 2.2 */publicvoiddecrement(){value--;}//-----------------------------------------------------------------------/** * Adds a value. * * @param operand * the value to add * * @since Commons Lang 2.2 */publicvoidadd(intoperand){this.value+=operand;}/** * Adds a value. * * @param operand * the value to add * @throws NullPointerException * if the object is null * * @since Commons Lang 2.2 */publicvoidadd(Numberoperand){this.value+=operand.intValue();}/** * Subtracts a value. * * @param operand * the value to add * * @since Commons Lang 2.2 */publicvoidsubtract(intoperand){this.value-=operand;}/** * Subtracts a value. * * @param operand * the value to add * @throws NullPointerException * if the object is null * * @since Commons Lang 2.2 */publicvoidsubtract(Numberoperand){this.value-=operand.intValue();}//-----------------------------------------------------------------------// shortValue and bytValue rely on Number implementation/** * Returns the value of this MutableInt as a int. * * @return the numeric value represented by this object after conversion to type int. */publicintintValue(){returnvalue;}/** * Returns the value of this MutableInt as a long. * * @return the numeric value represented by this object after conversion to type long. */publiclonglongValue(){returnvalue;}/** * Returns the value of this MutableInt as a float. * * @return the numeric value represented by this object after conversion to type float. */publicfloatfloatValue(){returnvalue;}/** * Returns the value of this MutableInt as a double. * * @return the numeric value represented by this object after conversion to type double. */publicdoubledoubleValue(){returnvalue;}//-----------------------------------------------------------------------/** * Gets this mutable as an instance of Integer. * * @return a Integer instance containing the value from this mutable */publicIntegertoInteger(){returnnewInteger(intValue());}//-----------------------------------------------------------------------/** * Compares this object to the specified object. The result is <code>true</code> if and only if the argument is * not <code>null</code> and is an <code>MutableInt</code> object that contains the same <code>int</code> value * as this object. * * @param obj * the object to compare with. * @return <code>true</code> if the objects are the same; <code>false</code> otherwise. */publicbooleanequals(Objectobj){if(objinstanceofMutableInt){returnvalue==((MutableInt)obj).intValue();}returnfalse;}/** * Returns a suitable hashcode for this mutable. * * @return a suitable hashcode */publicinthashCode(){returnvalue;}/** * Compares this mutable to another in ascending order. * * @param obj * the mutable to compare to * @return negative if this is less, zero if equal, positive if greater * @throws ClassCastException if the argument is not a MutableInt */publicintcompareTo(Objectobj){MutableIntother=(MutableInt)obj;intanotherVal=other.value;returnvalue<anotherVal?-1:(value==anotherVal?0:1);}/** * Returns the String value of this mutable. * * @return the mutable value as a string */publicStringtoString(){returnString.valueOf(value);}}
interfaceMutable{/** * Gets the value of this mutable. * * @return the stored value */ObjectgetValue();/** * Sets the value of this mutable. * * @param value * the value to store * @throws NullPointerException * if the object is null and null is invalid * @throws ClassCastException * if the type is invalid */voidsetValue(Objectvalue);}
Basicamente está dizendo que o argumento MutableInt na função GetPlayerName não é suportado, como está essa função?
squall926
Opa! achei que não teria resposta ^^!
Esse metodo é de uma dll e aceita um (ref inteiro), originalmente esse metodo foi projetado para C# que pode passar argumentos por ref.
squall926
Ahahah depois de muita procura achei com.sun.jna.ptr.IntByReference em java…
Foi a 1º vez que cheguei a pensar que não daria pra fazer algo em java.
JAVA IS POWER!
A sim, e java faz ref, todos os lugares que olhava diziam que não, que MutableInt que nada…