Java与C的相互调用

 

java:

package com.nan.callback;



import android.app.Activity;

import android.os.Bundle;

import android.os.Handler;

import android.os.Message;

import android.view.View;

import android.widget.Button;

import android.widget.TextView;





public class MyCallbackActivity extends Activity

{

    private Button intButton = null;

    private Button stringButton = null;

    private Button arrayButton = null;

    private TextView intTextView = null;

    private TextView stringTextView = null;

    private TextView arrayTextView = null;

   

    private Handler mHandler = null;

   

   

    /** Called when the activity is first created. */

    @Override

    public void onCreate(Bundle savedInstanceState)

    {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.main);

       

        intButton = (Button)this.findViewById(R.id.intbutton);

        //注册按钮监听

        intButton.setOnClickListener(new ClickListener());

        stringButton = (Button)this.findViewById(R.id.stringbutton);

        //注册按钮监听

        stringButton.setOnClickListener(new ClickListener());

        arrayButton = (Button)this.findViewById(R.id.arraybutton);

        //注册按钮监听

        arrayButton.setOnClickListener(new ClickListener());

       

        intTextView = (TextView)this.findViewById(R.id.inttextview);

        stringTextView = (TextView)this.findViewById(R.id.stringtextview);

        arrayTextView = (TextView)this.findViewById(R.id.arraytextview);

       

        //消息处理     

        mHandler = new Handler()

        {

            @Override

            public void handleMessage(Message msg)

            {

                switch(msg.what)

                {

                    //整型

                    case 0:

                    {

                        intTextView.setText(msg.obj.toString());

                        break;

                    }

                    //字符串

                    case 1:

                    {

                        stringTextView.setText(msg.obj.toString());

                        break;

                    }

                    //数组

                    case 2:

                    {   byte[] b = (byte[])msg.obj;                 

                        arrayTextView.setText(Byte.toString(b[0])+Byte.toString(b[1])+Byte.toString(b[2])+Byte.toString(b[3])+Byte.toString(b[4]));                    

                        break;

                    }

                }

                              

            }      

           

        };

       

       

    }

           

    //按钮监听实现

    public class ClickListener implements View.OnClickListener

    {



        @Override

        public void onClick(View v)

        {

            // TODO Auto-generated method stub

            switch(v.getId())

            {

                case R.id.intbutton:

                {

                    //调用JNI中的函数

                    callJNIInt(1);     

                    break;

                }

                case R.id.stringbutton:

                {

                    //调用JNI中的函数

                    callJNIString("你好A");            

                    break;

                }

                case R.id.arraybutton:

                {               

                    //调用JNI中的函数

                    callJNIByte(new byte[]{1,2,3,4,5});              

                    break;

                }

            }

        }

       

    }

 

   

    //被JNI调用,参数由JNI传入

    private void callbackInt(int i)

    {

        Message msg = new Message();

        //消息类型

        msg.what = 0;

        //消息内容

        msg.obj = i;

        //发送消息

        mHandler.sendMessage(msg);

    }

   

    //被JNI调用,参数由JNI传入

    private void callbackString(String s)

    {

        Message msg = new Message();

        //消息类型

        msg.what = 1;

        //消息内容

        msg.obj = s;

        //发送消息

        mHandler.sendMessage(msg);

    }

   

    //被JNI调用,参数由JNI传入

    private void callbackByte(byte[] b)

    {

        Message msg = new Message();

        //消息类型

        msg.what = 2;

        //消息内容

        msg.obj = b;    

        //发送消息

        mHandler.sendMessage(msg);

    }

   

    //本地方法,由java调用

    private native void callJNIInt(int i);

    private native void callJNIString(String s);

    private native void callJNIByte(byte[] b);

   

    static

    {

        //加载本地库

        System.loadLibrary("myjni");

    }

   

}

C:

#include <string.h>

#include <stdio.h>

#include <stdlib.h>

#include <unistd.h>

#include <sys/ioctl.h>

#include <sys/types.h>

#include <sys/stat.h>

#include <fcntl.h>



#include <jni.h>

#include <android/log.h>



#define LOGI(...) ((void)__android_log_print(ANDROID_LOG_INFO, "native-activity", __VA_ARGS__))

#define LOGW(...) ((void)__android_log_print(ANDROID_LOG_WARN, "native-activity", __VA_ARGS__))







/**********传输整数*************



*/

JNIEXPORT void JNICALL Java_com_nan_callback_MyCallbackActivity_callJNIInt( JNIEnv* env, jobject obj , jint i)

{

    //找到java中的类

    jclass cls = (*env)->FindClass(env, "com/nan/callback/MyCallbackActivity");

    //再找类中的方法

    jmethodID mid = (*env)->GetMethodID(env, cls, "callbackInt", "(I)V");

    if (mid == NULL)

    {

        LOGI("int error");

        return; 

    }

    //打印接收到的数据

    LOGI("from java int: %d",i);

    //回调java中的方法

    (*env)->CallVoidMethod(env, obj, mid ,i);

       

}   



/********传输字符串*************

*/

JNIEXPORT void JNICALL Java_com_nan_callback_MyCallbackActivity_callJNIString( JNIEnv* env, jobject obj , jstring s)

{

    //找到java中的类

    jclass cls = (*env)->FindClass(env, "com/nan/callback/MyCallbackActivity");

    //再找类中的方法

    jmethodID mid = (*env)->GetMethodID(env, cls, "callbackString", "(Ljava/lang/String;)V");

    if (mid == NULL)

    {

        LOGI("string error");

        return; 

    }

    const char *ch;

    //获取由java传过来的字符串

    ch = (*env)->GetStringUTFChars(env, s, NULL);

    //打印

    LOGI("from java string: %s",ch);

    (*env)->ReleaseStringUTFChars(env, s, ch);   

    //回调java中的方法

    (*env)->CallVoidMethod(env, obj, mid ,(*env)->NewStringUTF(env,"你好haha"));



}



/********传输数组(byte[])*************

*/

JNIEXPORT void JNICALL Java_com_nan_callback_MyCallbackActivity_callJNIByte( JNIEnv* env, jobject obj , jbyteArray b)

{

    //找到java中的类

    jclass cls = (*env)->FindClass(env, "com/nan/callback/MyCallbackActivity");

    //再找类中的方法

    jmethodID mid = (*env)->GetMethodID(env, cls, "callbackByte", "([B)V");

    if (mid == NULL)

    {

        LOGI("byte[] error");

        return; 

    }

   

    //获取数组长度

    jsize length = (*env)->GetArrayLength(env,b);

    LOGI("length: %d",length);   

    //获取接收到的数据

    int i;

    jbyte* p = (*env)->GetByteArrayElements(env,b,NULL);

    //打印

    for(i=0;i<length;i++)

    {

        LOGI("%d",p[i]);   

    }



    char c[5];

    c[0] = 1;c[1] = 2;c[2] = 3;c[3] = 4;c[4] = 5;

    //构造数组

    jbyteArray carr = (*env)->NewByteArray(env,length);

    (*env)->SetByteArrayRegion(env,carr,0,length,c);

    //回调java中的方法

    (*env)->CallVoidMethod(env, obj, mid ,carr);

}

 

Reprinted from:http://blog.csdn.net/vincent_czz/article/details/7688882

你可能感兴趣的:(java)