gpt4 book ai didi

java - 如何通过 SWIG/JNI 在 Java 中使用 SWIG 生成的 C 结构作为 C 函数的输入

转载 作者:塔克拉玛干 更新时间:2023-11-02 07:55:04 25 4
gpt4 key购买 nike

我有一个 SWIG 接口(interface)文件,它向我的 Java 应用程序公开了一些 C 函数(通过 JNI),这些 C 结构用作 C 函数的输入(通过 SWIG/JNI)。 SWIG 将结构生成为 Java 类,但我不确定如何设置结构属性,因为 setter 采用 SWIG 生成的类型。在将结构属性作为输入从我的 Java 类传递到 C 函数之前,我需要设置它。 example_location_id_t_ 是我需要传递的类,但是 Id 的 setter 和 Phy_idx采用以下 SWIG 类型。如何填充 SWIGTYPE_p_unsigned_charSWIGTYPE_p_uint32_t这样我就可以设置 IdPhy_idx SWIGTYPE_p_uint32_t 的属性类(class)?

setId(SWIGTYPE_p_unsigned_char value)setPhy_idx(SWIGTYPE_p_uint32_t value)

package com.test.jni;

public class SWIGTYPE_p_unsigned_char {
private long swigCPtr;

protected SWIGTYPE_p_unsigned_char(long cPtr, boolean futureUse) {
swigCPtr = cPtr;
}

protected SWIGTYPE_p_unsigned_char() {
swigCPtr = 0;
}

protected static long getCPtr(SWIGTYPE_p_unsigned_char obj) {
return (obj == null) ? 0 : obj.swigCPtr;
}
}


package com.test.jni;

public class SWIGTYPE_p_uint32_t {
private long swigCPtr;

protected SWIGTYPE_p_uint32_t(long cPtr, boolean futureUse) {
swigCPtr = cPtr;
}

protected SWIGTYPE_p_uint32_t() {
swigCPtr = 0;
}

protected static long getCPtr(SWIGTYPE_p_uint32_t obj) {
return (obj == null) ? 0 : obj.swigCPtr;
}
}

package com.test.jni;

public class example_location_id_t_ {
private long swigCPtr;
protected boolean swigCMemOwn;

public example_location_id_t_ (long cPtr, boolean cMemoryOwn) {
swigCMemOwn = cMemoryOwn;
swigCPtr = cPtr;
}

public static long getCPtr(example_location_id_t_ obj) {
return (obj == null) ? 0 : obj.swigCPtr;
}

protected void finalize() {
delete();
}

public synchronized void delete() {
if (swigCPtr != 0) {
if (swigCMemOwn) {
swigCMemOwn = false;
ExampleJNI.delete_example_location_id_t_(swigCPtr);
}
swigCPtr = 0;
}
}

public void setId(SWIGTYPE_p_unsigned_char value) {
ExampleJNI.example_location_id_t__id_set(swigCPtr, this, SWIGTYPE_p_unsigned_char.getCPtr(value));
}

public SWIGTYPE_p_unsigned_char getId() {
long cPtr = ExampleJNI.example_location_id_t__id_get(swigCPtr, this);
return (cPtr == 0) ? null : new SWIGTYPE_p_unsigned_char(cPtr, false);
}

public void setPhy_idx(SWIGTYPE_p_uint32_t value) {
ExampleJNI.example_location_id_t__phy_idx_set(swigCPtr, this, SWIGTYPE_p_uint32_t.getCPtr(value));
}

public SWIGTYPE_p_uint32_t getPhy_idx() {
return new SWIGTYPE_p_uint32_t(ExampleJNI.example_location_id_t__phy_idx_get(swigCPtr, this), true);
}

public example_location_id_t_() {
this(ExampleJNI.new_example_location_id_t_(), true);
}

}

最佳答案

在没有提供任何额外信息的情况下,SWIG 默认假设您希望将事物包装为一种可以返回并从一个函数传递给另一个函数的类型,即使它不能用目标语言进行有意义的包装。

每次您看到以 SWIGTYPE_... 开头的类型时,这意味着 SWIG 不知道如何生成更好的包装器,而这是它设法想出的最好的包装器。

SWIG 确实提供了可以在此处为您提供帮助的默认类型映射:

  • 对于 setPhy_idx(uint32_t value);,您需要在界面中添加的是:

    %include "stdint.i"

    void setPhy_idx(uint32_t value);

    目标语言中将使用可以表示uint32_t的类型。

  • 对于 setId(unsigned char *value); 这完全取决于 value 实际是什么 - 如果它是一个 NULL 终止字符串你可以这样做:

    %apply char * { unsigned char * };

    void setId(unsigned char *value);

    String 将用于您的目标语言。

    如果你想将指针作为整数类型传递,你可以使用类似的东西:

    %apply unsigned long { unsigned char * };

    void setId(unsigned char *value);

    相反。

    如果 unsigned char *value 是指向单个 unsigned char 的指针,您可以:

    %include "typemaps.i"
    %apply unsigned char *INPUT { unsigned char *value };

    void setId(unsigned char *value);

    指示 SWIG 将指针视为单个指针。 (这可以应用于 uint32_t 如果它也是一个指针)

关于java - 如何通过 SWIG/JNI 在 Java 中使用 SWIG 生成的 C 结构作为 C 函数的输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8235313/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com