安卓JNI传结构体

安卓层代码:
package com.demouhf.uhfjni;

import android.util.Log;
class Foo {
    protected int len;
    protected String name;
}
public class Demouhf {
	static {
        try {
            Log.i("JNI", "wqf Trying to load libnhf.so");
            /* 調用gsensor.so */
            System.loadLibrary("jni_nhf"); 
        }
        catch (UnsatisfiedLinkError ule) {
            Log.e("JNI", "wqf WARNING: Could not load libnhf.so");
        }}
	 
	
	//public static native int as3992_get_version(Reader_Version_Info *readerinfo);
	public static native int openport(String port,int baud,char parity, int databits, int stopbits);
	public static native int closeport();
	public static native String getversion();
	public static native String inventory();
	public static native int select(int[] epc);
	public static native int stopinventory();

	//public static native int openport();

	public static native int open();
	public static native int foo(Foo fooObj);
}
package com.demouhf.uhfjni;

import java.text.DecimalFormat;

import android.app.Activity;
import android.content.Context;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.os.Bundle;
import android.text.util.Linkify;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;
import android.util.Log;
import android.os.Handler; 



public class UHFActivity extends Activity {
    /** Called when the activity is first created. */
    private Button open_device;
    private Button getvision;
	private Button onceseeklabel;
	private Button stopseeklabel;
	private Button moreseeklabel;
	private Button selectepc;
	private EditText selectedit;
	private TextView text_show;

	
	public  int fd = 0;
	public  static int flag=0;
	public  static int flag_time=0; 

	Handler handler=new Handler();
	Runnable runnable=new Runnable(){
	@Override
	public void run() {
	// TODO Auto-generated method stub
	//要做的事情
		Log.i("wqfrunnable", "-----------------time--------------------\n");
		String text=null;
		text = Demouhf.inventory();
		if(text!=null)text_show.setText(text);
		else text_show.setText("NULL");
		handler.postDelayed(this, 1000);
	}
	};

	//打开设备
	private Button.OnClickListener open_listener= new Button.OnClickListener(){
	 public void onClick(View v)
	 {
		if(flag==0){
				fd = Demouhf.openport("/dev/ttyS0",115200,'N',8,1);
				Toast.makeText(getApplicationContext(), "Demouhf.openport",Toast.LENGTH_SHORT).show();
				if(fd>0){
					setTitle("Connect  device success! ");
					Log.i("BUTTON", "Connect  device sucdddcess!");
					open_device.setText("Close");
					flag=1;
				}else{
					setTitle("Connect  device false! ");
					Log.i("BUTTON", "Connect  device false!");
				}
			}else{
				Demouhf.closeport();
				open_device.setText("Open");
				flag=0;
				Toast.makeText(getApplicationContext(), "Demouhf.closeport",Toast.LENGTH_SHORT).show();
				setTitle("Close  device success! ");
				Log.i("BUTTON", "Close  device success!");
			}
	  }
	  
};
	//获取版本号
	private Button.OnClickListener getvision_listener= new Button.OnClickListener(){
	 public void onClick(View v)
	 {
			if(flag==0){text_show.setText("please open the series first! ");}else{
			String text="wqf";
			Log.i("JNI", "wqf getvision_listener");
			text = Demouhf.getversion();
			if(text!=null)text_show.setText(text);
			else text_show.setText("NULL");
			setTitle("getvision_listener! ");
			}
	 }
};
	//单次查询标签
	private Button.OnClickListener onceseeklabel_listener= new Button.OnClickListener(){
	 public void onClick(View v)
	 {
			Foo fooe = new Foo();
			Demouhf.foo(fooe);
			Log.i("JNI", "wqf ---2323423-----------------------------------\n");
			System.out.println(fooe.name);
			System.out.println(fooe.len);
		/*	if(flag==0){text_show.setText("please open the series first! ");}else{
			String text="wqf";
			Log.i("JNI", "wqf seeklabel_listener");
			text = Demouhf.inventory();
			if(text!=null)text_show.setText(text);
			else text_show.setText("NULL");
			setTitle("seeklabel_listener! ");
			}*/
	 }
};
	//多次查询标签
	private Button.OnClickListener moreseeklabel_listener= new Button.OnClickListener(){
	 public void onClick(View v)
	 {
			if(flag==0){text_show.setText("please open the series first! ");}else{
			Log.i("JNI", "wqf moreseeklabel_listener");
			if(flag_time==0){
				handler.postDelayed(runnable, 1000);//每两秒执行一次runnable.
				moreseeklabel.setText("StopMoreSeekLabel");
				flag_time=1;
			}else{
				handler.removeCallbacks(runnable);//停止定时器
				moreseeklabel.setText("StartMoreSeekLabel");
				flag_time=0;
			}
			setTitle("moreseeklabel_listener! ");
			}
	 }
};
	//停止查询标签
	private Button.OnClickListener stopseeklabel_listener= new Button.OnClickListener(){
	 public void onClick(View v)
	 {
			if(flag==0){text_show.setText("please open the series first! ");}else{
			int k;
			k = Demouhf.stopinventory();
			if(k>0)text_show.setText("Stop Seek Label success!");
			else text_show.setText("Stop Seek Label fail!");
			setTitle("stopseeklabel_listener! ");
			}
	 }
};
	//选中标签
	private Button.OnClickListener selectepc_listener= new Button.OnClickListener(){
	 public void onClick(View v)
	 {
			if(flag==0){text_show.setText("please open the series first! ");}else{
			String text="wqf";
			int sFlag=0;
			int[] strTab={0xE2, 0x00, 0x93, 0x66, 0x66, 0x17, 0x00, 0x36, 0x21, 0x40, 0x36, 0xBD};
			//strTab =  new int[12]={0xE2, 0x00, 0x93, 0x66, 0x66, 0x17, 0x00, 0x36, 0x21, 0x40, 0x36, 0xBD};
			Log.i("JNI", "wqf selectepc_listener");
			//sFlag = Demouhf.select(strTab);
			if(sFlag>0)text_show.setText("Selectepc success!");
			else text_show.setText("Selectepc fail!");
			setTitle("selectepc_listener! ");
			}		
		/*	
			int[] strTab ;  
			strTab = new int[12] ; 
			String str;
			str=selectedit.getText().toString();
			text_show.setText(str);
			*/
	 }
};

	@Override
    protected void onResume()
    {
   
	    super.onResume();
    }

    @Override
    protected void onPause()
    {
      super.onPause();
    }
	@Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

		open_device =(Button) findViewById(R.id.button_open);
		getvision=(Button) findViewById(R.id.getvision);
		onceseeklabel=(Button) findViewById(R.id.onceseeklabel); 
		stopseeklabel=(Button)findViewById(R.id.stopseeklabel);
		moreseeklabel=(Button)findViewById(R.id.moreseeklabel);
		selectepc=(Button)findViewById(R.id.selectepc);
		selectedit=(EditText)findViewById(R.id.select_edit);
		text_show=(TextView)findViewById(R.id.text_show);
         /*使用setOnClickListener來監聽事件*/
        open_device.setOnClickListener(open_listener);
        getvision.setOnClickListener(getvision_listener);
		onceseeklabel.setOnClickListener(onceseeklabel_listener); 
		stopseeklabel.setOnClickListener(stopseeklabel_listener); 
		moreseeklabel.setOnClickListener(moreseeklabel_listener);
		selectepc.setOnClickListener(selectepc_listener);
		
		text_show.setText("show text");

    }
}

C代码:

JNIEXPORT jint JNICALL Java_com_demouhf_uhfjni_Demouhf_foo
(JNIEnv *env, jclass mc, jobject fooObj)
{
    Foo_t * bar = malloc(sizeof(Foo_t));
    jclass clazz;
    jfieldID fid;

    //init the bar data of C
    strcpy(bar->name, "Yachun Miao");
    bar->len = strlen(bar->name);

    // mapping bar of C to foo
    clazz = (*env)->GetObjectClass(env, fooObj);
    if (0 == clazz) {
        printf("GetObjectClass returned 0\n");
        return (-1);
    }
    fid = (*env)->GetFieldID(env, clazz, "len", "I");
    (*env)->SetLongField(env, fooObj, fid, bar->len);

    fid = (*env)->GetFieldID(env, clazz, "name", "Ljava/lang/String;");
    jstring name = (*env)->NewStringUTF(env, bar->name);
    (*env)->SetObjectField(env, fooObj, fid, name);

    free(bar);
    return 0;
}


你可能感兴趣的:(安卓JNI传结构体)