JNI学习5——测试数组的使用

JNI文件:HelloWorld.cpp

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_lawrence_hello_HelloWorld */
//#include "HelloWorld.h"
#include "stdio.h"
#include "SerialTool.h"



#ifdef __cplusplus
extern "C" {
#endif

struct HelloClass
{
	jfieldID num;
	jfieldID tax;
};

struct CompanyClass
{
	jfieldID title;
	jfieldID id;
	jfieldID days;
	jfieldID money;
};



/*
 * Class:     com_lawrence_hello_HelloWorld
 * Method:    print
 * Signature: ()V
 */
JNIEXPORT jint JNICALL Java_com_lawrence_hello_HelloWorld_print
  (JNIEnv *_env, jobject thiz)
{
	struct HelloClass hello_class;
	struct CompanyClass company_class;
	jstring StrNum = charToString(_env, "no");
	LOGI("Java_com_lawrence_hello_HelloWorld_print start\n");
	
	jclass class1 = _env->FindClass("com/lawrence/hello/HelloWorld");
	hello_class.num = _env->GetFieldID(class1, "mNum", "I");
	LOGI("1=GetFieldID\n");
	hello_class.tax = _env->GetFieldID(class1, "mTax", "F");
	LOGI("2=GetFieldID\n");
	
	_env->SetIntField(thiz, hello_class.num, 12);
	_env->SetFloatField(thiz, hello_class.tax, 1.0);

	
	LOGI("SetIntField\n");
	
	LOGI("Java_com_lawrence_hello_HelloWorld_print end\n");
	
	return 9;
}


/*
 * Class:     Java_com_lawrence_hello_HelloWorld_getInfo
 * Method:    getInfo
 * Signature: 
 */
JNIEXPORT jobject JNICALL Java_com_lawrence_hello_HelloWorld_getInfo
  (JNIEnv *_env, jobject thiz)
{
	struct CompanyClass company_class;
	jstring StrNum = charToString(_env, "no");
	
	//内部类用$
	jclass class2 = _env->FindClass("com/lawrence/hello/HelloWorld$company");
	LOGI("3=GetFieldID\n");
	company_class.title = _env->GetFieldID(class2, "mTitle", "Ljava/lang/String;");
	LOGI("4=GetFieldID\n");
	company_class.id = _env->GetFieldID(class2, "mId", "B");
	
	LOGI("4=GetFieldID\n");
	company_class.days = _env->GetFieldID(class2, "mDays", "I");
	
	company_class.money = _env->GetFieldID(class2, "mMoney", "[I");
	
	jobject joCompany = _env->AllocObject(class2);
	
	LOGI("5=GetFieldID\n");	
	
	_env->SetObjectField(joCompany, company_class.title, StrNum);
	_env->SetByteField(joCompany, company_class.id, 20);
	_env->SetIntField(joCompany, company_class.days, 6);
	
	int abc[3] = {55, 10, 4};
	//创建一个新的java数组(jarray),但是jarray不是C数组类型,不能直接访问jarray
	jintArray jiArr = _env->NewIntArray(24);
	jint *ji;
	
	#if 1	//可用
	LOGI("6=GetFieldID\n");
	
	//JNI支持一系列的Get/Release<Type>ArrayElement 函数,允许本地代码获取一个指向基本C类型数组的元素的指针。
	ji = _env->GetIntArrayElements(jiArr, 0);
	memcpy(ji, abc, 2 * sizeof(int));
	_env->ReleaseIntArrayElements(jiArr, ji, 0);	//可加,可不加	
	
	_env->SetObjectField(joCompany, company_class.money, jiArr);
	
	
	
	#else	//可用
	//可以使用GetIntArrayRegion函数来把一个 int数组中的所有元素复制到一个C缓冲区中
	//SetIntArrayRegion则是逆过程
	LOGI("7=GetFieldID\n");
	_env->SetIntArrayRegion(jiArr, 0, 2, abc);	
	_env->SetObjectField(joCompany, company_class.money, jiArr);

	#endif
	
	LOGI("Java_com_lawrence_hello_HelloWorld_print end\n");
	
	return joCompany;
}





#ifdef __cplusplus
}
#endif




java文件:HelloWorld.java

package com.lawrence.hello;

import android.support.v7.appcompat.R.integer;


public class HelloWorld
{
	public native int print();
	
	public native company getInfo();
	
	public int mNum;
	public float mTax;
	public company com;
	
	public static class company
	{
		public String 	mTitle;		//String类型
		public byte		mId;		//Byte类型
		
		private int mDays;			//private: int类型
		private int[] mMoney;		//private: int基本数组类型

		public int getDays()
		{
			return mDays;
		}
		public String getMoneyStr()
		{
			if(mMoney.length > 0)
			{
				return Integer.toString(mMoney[0]) + " " + Integer.toString(mMoney[1]);
			}
			else {
				return "NULL";
			}
		}
		public int getMoneyLenth()
		{
			return mMoney.length;
		}
	}
	
	static
	{
		System.loadLibrary("HelloWorld");
	}
}


java主调文件PlaceholderFragment.java

package com.lawrence.ui;

import android.content.Context;
import android.content.Intent;
import android.content.res.ColorStateList;
import android.graphics.Color;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v7.appcompat.R.integer;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;

import com.lawrence.hello.HelloWorld;
import com.lawrence.hello.HelloWorld.company;
import com.lawrence.sms.R;



    /**
     * A placeholder fragment containing a simple view.
     */
    public class PlaceholderFragment extends Fragment {
    	
    	public Context mContext;
    	public Button mOkButton;
    	public HelloWorld mHello;
    	public TextView mTv;

        public PlaceholderFragment() {
        	mHello = new HelloWorld();
        }      
        
        

        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                Bundle savedInstanceState) {
            View rootView = inflater.inflate(R.layout.fragment_main, container, false);
            

            mContext = getActivity();
            mOkButton = (Button)rootView.findViewById(R.id.ok);	
            mTv = (TextView)rootView.findViewById(R.id.getText);
                        
            mOkButton.setOnClickListener(new View.OnClickListener()
            {
            	@Override
    			public void onClick(View view)
    			{
    				switch (view.getId())
    				{
    				case R.id.ok:
//    					Toast.makeText(getActivity(), "fuck", Toast.LENGTH_SHORT).show();
//    					Intent intent = new Intent("android.intent.action.htf");
//    					intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
//    					mContext.startActivity(intent);   					
//    					company c = native_getCompany(); //new company();
    					mHello.print();
    					company cy = mHello.getInfo();
    					String str = "hello: " + mHello.mNum + "\t" + mHello.mTax;
    					str = str + "\t mId: " + cy.mId + "\t mTitle: " + cy.mTitle + "\t mDays: " + cy.getDays() + "\t    mMoneyLenth: " + cy.getMoneyLenth() + "\t mMoney: " + cy.getMoneyStr() + " !";
    					//Toast.makeText(getActivity(), str, Toast.LENGTH_SHORT).show();
    					mTv.setText(str);
    					
    					break;

    				default:
    					break;
    				}
    			}
				
    		});
            
            return rootView;
        }
        

		
    }


你可能感兴趣的:(java,jni)