使用Swig从Python long int转换为unsigned int 64

时间:2018-07-24 15:12:36

标签: python swig

我正在使用Swig开发Python库。 我有一个类似于以下内容的类型图:

package id.sch.smktelkom.www.crud;

import android.content.Context;
import android.content.Intent; 
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ImageButton;
import android.widget.TextView;

import java.util.List;

public class CollectAdapter extends ArrayAdapter<Collect> {
    private List<Collect> items;
    private Context mContext;
    public CollectAdapter(Context context, List<Collect> items) {
        super(context, R.layout.item_collect, items);
        this.items = items;
        mContext = context;

    }
    @Override
    public int getCount() {
        return items.size();
    }
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        View v = convertView;

        if(v == null) {
            LayoutInflater li = LayoutInflater.from(getContext());
            v = li.inflate(R.layout.item_collect, null);
        }

        Collect app = items.get(position);

        if(app != null) {
            TextView id = (TextView) v.findViewById(R.id.txtpeminjam);
            TextView name = (TextView) v.findViewById(R.id.txtpinjaman);
            ImageButton btn = (ImageButton) v.findViewById(R.id.list_image);

            btn.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    Intent b = new Intent(mContext,LihatDataActivity.class);
                    mContext.startActivity(b);
                }
            });

            if(id != null) id.setText(app.getNama());

            if(name != null) name.setText(app.getPinjaman());

        }
        return v;
    }
}

我正在这样调用目标Python函数:

%typemap(in) (unsigned long long myLongParam){
   $1 = PyInt_AsUnsignedLongLongMask($input);
}

这应该是一个64位长的无符号整数。但是,该值似乎被截断了32位。

1 个答案:

答案 0 :(得分:2)

已解决。 问题不在那里。问题出在其他地方,与上面的代码无关。 我在执行以下错误代码:

%apply int* OUTPUT {Uint64*}

这告诉swig将Uint64与int相同,因此结果被截断了。它使用SWIG_From_int作为结果值。

我的解决方法是:

/*Uint64* parameter as reference */
%typemap(in, numinputs=0) Uint64* (Uint64 temp) {
    temp = 0;
    $1 = &temp;
}

/*Uint64* as function return typemap*/
%typemap(argout) Uint64* {
    %append_output( PyInt_FromLong( *$1 ) );
}