2013-04-15 45 views
6

Tôi đang tải một DLL C từ một chương trình được viết bằng Java. Tôi muốn để có thể gọi một trong những phương pháp từ DLL với tuyên bố này:Chuyển đổi con trỏ void ** sang loại Java tương đương

dll_function(const char* foo1, const char* foo2, const char* foo3, void** bar, size_t* bar2); 

Làm thế nào để gọi phương pháp này với các tham số kiểu đúng trong Java? Tôi biết (về mặt lý thuyết) làm thế nào để gọi nó, nhưng những gì tôi muốn biết là làm thế nào để vượt qua "void **" và "size_t *" từ chương trình Java của tôi? Về cơ bản, Tôi muốn biết những gì các "loại tương đương" cho khoảng trống và size_t *** là trong Java ...

tôi thấy lớp con trỏ nhưng không quản lý để có được nó làm việc? Rất cám ơn :)

+0

Bạn không. Các khái niệm không phải là mappable. Bạn phải hiểu cách các giá trị sẽ được sử dụng và "lừa gạt". Hoặc viết trình bao bọc C. –

Trả lời

1

size_t là số nguyên được sử dụng cho kích thước của một biến trong bộ nhớ; như vậy bạn nên an toàn khi sử dụng unsigned long trong Java.

void* có thể là con trỏ đến đối tượng không xác định. This question, khá thú vị về vấn đề này. Trong Java Object thường được sử dụng trong trường hợp này, nhưng tôi không biết làm thế nào bạn sẽ chuyển đổi giữa chúng, mặc dù this question có thể trợ giúp ở đó.

+0

Không có 'unsigned long' trong Java ... –

+0

Ah, điểm tốt. Trong trường hợp đó, 'long' trong mã 32 bit (vì nó là một số nguyên đã ký 64 bit) hoặc' BigInteger' trong mã 64 bit. Nghĩ về nó, vì vậy hãy đăng nhập vì bạn không thực sự làm bất cứ điều gì với nó trong mã Java, bạn có thể lấy đi chỉ với một địa chỉ dài 64 bit, miễn là chuyển đổi giữa Java và ngôn ngữ bản địa không 't mangle nó và có thể diễn giải lại các nhị phân như thể nó là một size_t. – Alan

+1

Tôi đọc mã nguồn JDK. 'long' được sử dụng để lưu trữ" các đối tượng ngang hàng "trong chính JDK (tìm kiếm' AWTObject' và tìm con trỏ 'pData' nếu bạn quan tâm). Nguồn Android cũng sử dụng 'long' cho cùng một mục đích. Vì vậy, tôi nghĩ rằng việc sử dụng 'long' là thực hành tốt nhất. –

1

Tôi đã làm việc trong dự án Java/JNI/C vài năm trước và chúng tôi phải duy trì các con trỏ C mờ trong các đối tượng Java. Chúng tôi đã sử dụng các giá trị long ở phía Java để giữ các con trỏ C, được chuyển đổi ở phía JNI từ jlong thành void* hoặc bất kỳ loại con trỏ nào chúng tôi cần.

Vì loại Java long rộng 64 bit và các con trỏ JNI/C thường là 32 bit hoặc 64 bit, chúng tôi không gặp bất kỳ vấn đề nào khi chuyển đổi giữa chúng.

0

tôi đã cố gắng giải pháp của bạn, nhưng tôi đoán tôi đã không thực sự hiểu một cách chính xác ... Nhưng tôi giải quyết vấn đề của tôi sử dụng này:

import com.sun.jna.ptr.IntByReference; 

tôi gọi là hàm C như thế trong chương trình Java của tôi:

IntByReference myVoidPointerPointer = new IntByReference(); 
myCLibrary.myCFunction(myVoidPointerPointer); 

chức năng C "myCFunction" trông như thế này:

void myCFunction(void** parameter); 

Bạn có thể làm điều đó không? Nó đang hoạt động, nhưng tôi đã tự hỏi nếu đó là một cách chính xác để làm điều đó.

Các vấn đề liên quan