zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    【索引】SyntaxHighlighter 使用参考
    【索引】博客心得
    SyntaxHighlighter 使用参考(一) 概述
    PEGA 十合一吉他控制器连接电脑玩《吉他英雄3》
    从SourceForge上获取CVS管理的开源代码
    从SourceForge上获取SVN管理的开源代码
    整数哈希介绍
    回文时间
    D2js 是如何处理并发的
    Windows 安装JRuby 生成 war 到 tomcat 运行
  • 原文地址:https://www.cnblogs.com/qiengo/p/2601517.html
Copyright © 2011-2022 走看看