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

原文地址:https://www.cnblogs.com/qiengo/p/2601517.html