我试图将我用c ++编写的一些函数转换为java。我确实有一个用c ++编写的.so库,现在我必须从我的Android应用程序中调用函数。这样的功能:
unsignd int Uninitialize();
---------------------------------------
unsignd int DeviceOpen(
const wchar_t* deviceID,
unsigned long* phDevice);
---------------------------------------
typedef struct BlobData_s {
unsigned long length;
unsigned char data[1];
} dsmBlobData_t;
unsignd int Enroll(
unsigned long hDevice,
const char* userID,
BlobData_s* pInputInfo,
void* pUserData);
现在你怎么看我有我想用java风格编写的函数和typedef,但我的问题是没有unsigned int
java类型(link)。我知道我可以使用int
代替jint
代替char*
,而不是jchar*
我可以使用const wchar_t*
,但我必须使用
unsigned long
unsigned char
jint Java_com_example_testApp_TestApp_DeviceOpen( jchar* deviceID, int* phDevice)
{
return DeviceOpen((const wchar_t*)deviceID, (unsigned long*)phDevice);
}
我可以使用什么代替那些类型。
我试试这种方式
{{1}}
我是对的吗?*
提前致谢ViToBrothers。
答案 0 :(得分:1)
我不相信你可以使用jchar*
,因为它不是Java的有效类型。
我建议你使用javah从Java类生成带有本机方法的Java头。这将显示正确的类型。 (我不知道Android的等价物是什么)
在许多情况下,没有直接的等价物,所以你必须使用方法来复制数据。
顺便说一句:我不会那么担心unsigned vs签名,因为涉及的号码只是存储一个id。这些不是您可以执行算术运算的值。答案 1 :(得分:1)
对于初学者,您必须将您的类型映射到Java类型。正如你所说,
Java中没有unsigned
,没有wchar_t
。一旦你决定了
在Java端使用什么类型(例如int
而不是unsigned
,或
也许long
; java.lang.String
和char*
可能wchar_t*
{{1}}),你必须使用它们声明你的原生方法,并且
以一种将它们映射到内部值的方式实现JNI。
此外,如果您的C ++代码使用异常,则必须捕获它们 在JNI界面中重新映射它们。
对于初学者,我会看一些现有的工具,比如swig,是否会这样做 工作。如果没有,我仍然会用它来获取示例代码,然后就可以了 复制/粘贴和编辑。