C代码
extern "C" int _declspec(dllexport) getXMLResult(char *result)
{
result = "abcd";
return 20;
}
这个函数的目的是传入字符指针,在函数内容修改指针指向的字符串内容java代码
public class JNATest {
// This is the standard, stable way of mapping, which supports extensive
// customization and mapping of Java to native types.
public interface CLibrary extends Library {
CLibrary INSTANCE = (CLibrary)
Native.loadLibrary("TestDLL.dll", CLibrary.class);
int getXMLResult(byte[] result);
} /**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println("begin");
//WString s = new WString("Hello, World");
//System.out.println("s="+s.toString());
byte[] c = {'a','a','a','a'};
System.out.println("c="+Native.toString(c));
//ByteByReference[] iref = new ByteByReference[4];
int i = CLibrary.INSTANCE.getXMLResult(c);
System.out.println("i="+i);
System.out.println("c="+Native.toString(c));
//System.out.println("s="+s.toString());
System.out.println("end");
}}
Java中byte[] c初始化,调用DLL中函数,但byte[] c的值没有被修改。
使用Java中用String也不行,指针一时也没搞懂怎么用。现在时间很急,有有经验的人帮忙指点下吗?
万分感谢。
extern "C" int _declspec(dllexport) getXMLResult(char *result)
{
result = "abcd";
return 20;
}
这个函数的目的是传入字符指针,在函数内容修改指针指向的字符串内容java代码
public class JNATest {
// This is the standard, stable way of mapping, which supports extensive
// customization and mapping of Java to native types.
public interface CLibrary extends Library {
CLibrary INSTANCE = (CLibrary)
Native.loadLibrary("TestDLL.dll", CLibrary.class);
int getXMLResult(byte[] result);
} /**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println("begin");
//WString s = new WString("Hello, World");
//System.out.println("s="+s.toString());
byte[] c = {'a','a','a','a'};
System.out.println("c="+Native.toString(c));
//ByteByReference[] iref = new ByteByReference[4];
int i = CLibrary.INSTANCE.getXMLResult(c);
System.out.println("i="+i);
System.out.println("c="+Native.toString(c));
//System.out.println("s="+s.toString());
System.out.println("end");
}}
Java中byte[] c初始化,调用DLL中函数,但byte[] c的值没有被修改。
使用Java中用String也不行,指针一时也没搞懂怎么用。现在时间很急,有有经验的人帮忙指点下吗?
万分感谢。
你要传 MemoryPointer
能有个代码片段的例子吗,或者把思路、流程说的更详细些吗?我好参考下。
现在非常急,本来用JNative,遇到java和c的类型转换问题,刚开始用JNA,不熟悉。
int getXMLResult(Memory result);但不知道在实际调用时如何处理Memory对象。
问题1:Memory对象初始化时需要指定内存大小,这个大小如何计算?
Memory m = new Memory(???);//如何计算
问题2:如何给这个Memory指向的内容赋值,因为我要先打印调用C前的内容,再打印调用后修改的内容,以便验证是否正常工作。
问题3:如何取回调用C后的内存里的字符串?哪位有经验的麻烦再指点下,多谢。
void getXMLResult(char *result) {
memcpy(result, "abcde", 5);
}
private static native void getXMLResult(Memory m); public static void main(String[] args) throws Exception {
byte[] arr = "aaaaa\0".getBytes("ascii");
Memory m = new Memory(arr.length);
m.write(0, arr, 0, arr.length);
System.out.println(m.getString(0, false));
getXMLResult(m);
System.out.println(m.getString(0, false));
}
你的问题解决了吗、
我也有遇到同样的情况。你用abc130314的代码解决了吗?我按照他的写还是没有用。