JNI我可以使用什么类型而不是给定(unsigned int,const char *,const wchar_t *,....)

时间:2011-05-11 08:02:34

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

Stackoverflow用户!

我试图将我用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。

2 个答案:

答案 0 :(得分:1)

我不相信你可以使用jchar*,因为它不是Java的有效类型。

我建议你使用javah从Java类生成带有本机方法的Java头。这将显示正确的类型。 (我不知道Android的等价物是什么)

在许多情况下,没有直接的等价物,所以你必须使用方法来复制数据。

顺便说一句:我不会那么担心unsigned vs签名,因为涉及的号码只是存储一个id。这些不是您可以执行算术运算的值。

答案 1 :(得分:1)

对于初学者,您必须将您的类型映射到Java类型。正如你所说, Java中没有unsigned,没有wchar_t。一旦你决定了 在Java端使用什么类型(例如int而不是unsigned,或 也许long; java.lang.Stringchar*可能wchar_t* {{1}}),你必须使用它们声明你的原生方法,并且 以一种将它们映射到内部值的方式实现JNI。

此外,如果您的C ++代码使用异常,则必须捕获它们 在JNI界面中重新映射它们。

对于初学者,我会看一些现有的工具,比如swig,是否会这样做 工作。如果没有,我仍然会用它来获取示例代码,然后就可以了 复制/粘贴和编辑。