Android studio NDK成长记录(四)C调Java的各种情况解析

C调用Java的各种情况:
C调用Java代码利用反射进行调用,jni.h中提供相应API,直接调用API进行调用。调用基本步骤如下:

  1. 得到需要调用的类的字节码
  2. 得到方法的ID
    得到方法ID的时候调用GetMethodID(env, jclass1, "add_number", "(II)I");这个方法的最后一个参数是方法签名,对方法签名其实是对字节码进行签名,所以需要先在Java类中写好方法,然后rebuild project,再进入build\intermediates\classes\debug目录下,打开doc窗口执行‘javap -s + 全类名’ 命令,如“javap -s com.picovr.javacall.NativeMethord”:

  3. 实例化该类得到该类的对象
  4. 调用该方法

Java代码:

package com.picovr.javacall;

import android.util.Log;

/**
 * Created by PICO-USER on 2017/1/18.
 */

public class NativeMethord {

    static {

        System.loadLibrary("native_jni");
    }

    public void helloFromJava() {

        Log.i("NativeMethord", "helloFromJava");

    }

    public int add_number(int x, int y) {

        Log.i("NativeMethord", "add_number add :" + x + "  y:" + y);
        return x + y;
    }
}

C代码:

/*
 *调用Java中的add_number方法,对20和30进行加法运算
 */
JNIEXPORT jint JNICALL Java_com_picovr_javacall_NativeMethord_addNumberCallback
        (JNIEnv *env, jobject jobj) {

    //1.得到字节码
    //jclass      (*FindClass)(JNIEnv*, const char*);
    jclass jclass1 = (*env)->FindClass(env, "com/picovr/javacall/NativeMethord");

    //2.得到方法ID
    //jmethodID   (*GetMethodID)(JNIEnv*, jclass, const char*, const char*);
    jmethodID jmethodID1 = (*env)->GetMethodID(env, jclass1, "add_number",
                                               "(II)I");//倒数第一个参数:方法签名,倒数第二个参数:方法名

    //3.实例化类
    //jobject     (*AllocObject)(JNIEnv*, jclass);
    jobject jobject1 = (*env)->AllocObject(env, jclass1);

    //调用方法
    //jint        (*CallIntMethod)(JNIEnv*, jobject, jmethodID, ...);
    jint result = (*env)->CallIntMethod(env, jobject1, jmethodID1, 20, 30);
    LogI("result :%d", result);
}

/*
 *调用java中的helloFromJava方法
 */
JNIEXPORT jint JNICALL Java_com_picovr_javacall_NativeMethord_getStringCallback
        (JNIEnv *env, jobject jobj) {

    //1.得到字节码
    //jclass      (*FindClass)(JNIEnv*, const char*);
    jclass jclass1 = (*env)->FindClass(env, "com/picovr/javacall/NativeMethord");

    //2.得到方法ID
    //jmethodID   (*GetMethodID)(JNIEnv*, jclass, const char*, const char*);
    jmethodID jmethodID1 = (*env)->GetMethodID(env, jclass1, "helloFromJava",
                                               "()V");//倒数第一个参数:方法签名,倒数第二个参数:方法名

    //3.实例化类
    //jobject     (*AllocObject)(JNIEnv*, jclass);
    jobject jobject1 = (*env)->AllocObject(env, jclass1);

    //调用方法
    //jint        (*CallIntMethod)(JNIEnv*, jobject, jmethodID, ...);
    (*env)->CallVoidMethod(env, jobject1, jmethodID1);
    LogI("Java_com_picovr_javacall_NativeMethord_getStringCallback");
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值