JNI:从C代码到Java和JNI 出身背景

JNI:从C代码到Java和JNI 出身背景,java,android,c,eclipse,java-native-interface,Java,Android,C,Eclipse,Java Native Interface,我正在eclipse中为android开发一个应用程序,现在我遇到了一个问题,需要您的帮助。所以我必须从JAVA应用程序调用用C编写的函数。但是在我写代码的过程中,我有一些问题,你可以在下面看到。我在等待你的答案和想法 C代码: JAVA代码: 在JAVA代码中,我使用int而不是unsignedlong来编写代码 class jblobData_c { public int langth; *Question 1.* } public class ApplicationMai

我正在eclipse中为android开发一个应用程序,现在我遇到了一个问题,需要您的帮助。所以我必须从JAVA应用程序调用用C编写的函数。但是在我写代码的过程中,我有一些问题,你可以在下面看到。我在等待你的答案和想法

C代码: JAVA代码: 在JAVA代码中,我使用int而不是unsignedlong来编写代码

class jblobData_c {
    public int langth;
    *Question 1.*
}

public class ApplicationMainClass extends Activity {
    // Some code goes here
    ......................

    public native int JCheckEnrollmentExist( int jhdevive, *Question 2.* );

}
问题1

我可以用什么来代替JAVA代码中的无符号字符? 我必须用JAVA代码而不是无符号字符数据[1]? 问题2

如何在JAVA代码中使用类jblobData_c而不是blobData_t*pInputInfo? 我必须用JAVA而不是blobData\u t*pInputInfo编写什么? JNI代码: 问题3

我必须在CheckEnrollmentExist函数中编写的是C代码函数,而不是blobData\u t*pInputInfo,以便该函数正常工作,并且给定的参数相同 参考 关于问题1:

您可以使用jchar。java中的原语字符没有签名,这是唯一没有签名的原语。请注意,jchar是一个UTF-16字符,因此您必须将jchar映射到一个常规字符,就像处理任何字符转换问题一样。对于简单的转换,这通常可以通过强制转换来完成

char c_char = (char)java_char;
因为核心ASCII在ASCII和UTF-16之间共享相同的数值。但是,如果有人试图通过接口传递特殊字符,这很容易出错。更好的方法是在java端,因为使用适合您平台的字符集更容易将字符转换为字节,以确保C层中的平台兼容性。然后您只需要将字节[]传递给JNI调用,这些字节将正确地对应于C可能期望的字符

关于问题2:

如果您的CheckEnrollment存在。。。方法是JNI绑定入口点,您无法安全地更改数据类型。这意味着所有条目输入必须是JNI数据类型值。虽然您可能能够选择C数据类型的等价物,并且您可能能够让您的编译器执行此操作,但这种技术应该受到反对。这意味着JNI入口点不能接受JNI头中未定义的结构数据结构。换句话说,您不能将自己的结构传递给该方法

如果该方法需要跨调用访问C结构,请使用其他方法。我见过人们将指向分配数据结构的指针存储在一个成员整数或long中进行正确的转换。然后,您可以重写本机代码端,从传递到调用中的this对象检索指针,然后执行解引用以获得所需的数据

关于问题3:


这实际上与问题2相同。在放置的绑定包装器中,您将在java对象的int或long字段中检索指针的存储值,将其转换为适当的结构指针,然后将其传递给内部方法。由于指针的传递是一个C到C的调用,因此不需要额外的魔法。

对于问题1,我至少要说,一个字节就是您想要的。还遇到了另一个帖子,一个字节就是你想要的。你能解释一下吗?谢谢很抱歉,看看Java规范,一个字节确实是有符号的……很抱歉,您的回答对我没有帮助,因为它没有包含任何有用的链接或示例,说明如何解决我的问题。你能给我更多的详细信息或文章或一些链接,以便我可以检查他们,并找到我的问题的答案!非常感谢@维托,什么问题?你问了三个具体问题。传递到JNI绑定方法的所有参数必须是JNI.h声明的数据类型。在C语言中,您需要根据需要进行强制转换。如果进行分配,则需要将每对象指针存储在Java类中,以便当该类返回到JNI层时,可以访问指针。
JNIEXPORT jint JNICALL Java_com_Test_JCheckEnrollmentExist(JNIEnv* env, jobject obj, jint jhdevice, *Question 2.* ) {

    // Call the base function from C code.
    return CheckEnrollmentExist( jhdevice, *Question 3.*);
}
char c_char = (char)java_char;