jni不支持void *,unsigned int *等类型,该怎么办?
|
我有一个用C ++编写的.so(共享库),我们称它为functional.so,在其中我实现了不同的功能,这是一些功能的列表:
1. unsigned long Initialize(void* userData);
2. unsigned long Uninitialize(void);
3. unsigned long DeviceOpen( unsigned long id, unsigned long* device);
4. unsigned long DeviceClose( unsigned long device );
等等 ...
我想在我的Android Java应用程序中使用该库的(functionality.so)功能。为此,我在我的android应用程序项目文件夹中创建jni文件夹,并将文件放置在其中:
Android.mk
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := Test_library
LOCAL_SRC_FILES := Test_library.c
## Linking functionality library
LOCAL_LDLIBS := -lfunctionality
include $(BUILD_SHARED_LIBRARY)
Test_library.c
#include <string.h>
#include <jni.h>
#include \"Test_library.h\"
jint Java_com_Dsm_Test_DsmLibraryTest_vtUninitialize(JNIEnv* env, jobject thiz) {
return Uninitialize( );
}
jint Java_com_Dsm_Test_DsmLibraryTest_vtDeviceClose(JNIEnv* env, jobject thiz, jint hDevice) {
return DeviceClose( hDevice );
}
Test_library.h
头文件,其中声明了Initialize,Uninitialize,DeviceOpen,DeviceClose函数。
之后,我运行ndk-build并创建一个Test_library.so库,并将其加载到我的Java应用程序中,并像这样使用它们:
// Some code
public native int Uninitialize( );
public native int DeviceClose( int hDevice );
static {
System.loadLibrary(\"Test_library\");
}
一切运行正常。我要添加其他两个功能之后
1. unsigned long Initialize(void* userData);
2. unsigned long DeviceOpen( unsigned long id, unsigned long* device);
`
现在的问题:
我如何才能将这两个函数编写为Java本机?由于Java中没有void *或无符号long *类型
我如何在Test_library.c中编写与jni.h中相同的函数,没有void **或无符号long *类型
感谢帮助。
没有找到相关结果
已邀请:
4 个回复
荤碗
将指针(或指向该指针的指针,或其他)传递回Java。 Java代码除了将它作为参数传递给其他方法之一之外,将不能用于任何其他用途;但是通常这就是您真正想要的。另一方面,如果您希望使用Java设置的数据来调用ѭ6,,则
是不合适的。您将需要使用Java类,并在JNI中使用反射来从中获取所需的信息。 粗略地讲,您可以将
和ѭ9wrap包装起来:
然后在Java中使用它们(无效!):
现在,如果我们包装一些需要一块内存作为参数的其他函数,我们也可以包装它们,并让它们接受
参数,就像
一样。 Java变量“ 14”表示一个内存地址这一事实在Java中是完全不透明的,但是仍然很有用。 Java的窗口系统实现(即AWT,SWT)使用相同的方式将本机窗口小部件句柄与Java组件相关联。 现在,如果您希望
能够从Java中获取有用的参数,那么
就不会削减它。您需要编写方法以接受Java对象作为参数。这是允许您使用Java操作对象的唯一方法。 我不想在这里重复所有代码,但是Sun的JNI教程在这里。这是关于调用Java对象(arbitrary17对象,或作为参数传递给您的方法的任意方法)的部分,这与访问对象的字段类似。
埠仙俊
调用该方法时,请确保分配一个直接的ByteBuffer(请参阅java.nio.ByteBuffer和JNI nio用法):
在C端,您可以执行以下操作:
您可以使用ByteBuffer方法从Java端的缓冲区读取和写入。 您也可以用ѭ21with在C侧分配字节缓冲区。 现在,对于第二个函数,我假设使用unsigned long *参数返回一个结果。您可以使用相同的方法(直接ByteBuffers),但是我建议使用另一种方法,这种方法不必为这么小的值分配缓冲区。 在Java方面:
在C端:
然后,您从Java调用方法:
有关从JNI访问数组的更多信息,请参见JNI数组操作。
森含械
运行jnigen generator后,您将获得带有C代码和绑定的* .cpp文件。 * .h也会自动创建。 cpp将如下所示:
使用jnigen,这就是您的方法的外观:
伞腹