JNI 反射 C调用Java方法

java端:

package com.example.myapplication;

import android.util.Log;

/**
 * @Author: ddup
 * @Date: 2024/6/27
 * @Description: C代码调用Java代码
 */
public class Api {
    static {
        System.loadLibrary("CCallJava"); //加载动态链接库
    }
    //当执行这个方法的时候,让C代码调用
    //public int add(int x, int y)
    public native void callbackAdd();

    /**
     * 当执行这个方法的时候,让C代码调用
     * public void helloFromJava()
     */
    public native void callbackHelloFromJava();

    /**
     * 当执行这个方法的时候,让C代码调用
     * public void printString(String s)
     */
    public native void callbackPrintString();

    /**
     * 当执行这个方法的时候,让C代码调用
     * public static void sayHello(String s)
     */
    public native void callbackSayHello();

    public int add(int x, int y) {
        Log.e("ddup", "add()  x=" + x + " y=" + y);
        return x + y;
    }

    public void helloFromJava() {
        Log.e("ddup", "helloFromJava");
    }

    public void printString(String s) {
        Log.e("ddup", "C中输入的:" + s);
    }

    public static void sayHello(String s) {
        Log.e("ddup", "我是java代码中的JNI" +
                ".java中的sayHello(String s)静态方法,我被C调用了:" + s);
    }
}

c端:

//
// Created by ddup on 2024/6/27.
//

#include "com_example_myapplication_Api.h"
#include <stdlib.h>
#include <stdio.h>

#include <android/log.h>
#include <jni.h>

#define TAG "ddup"
#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG,TAG ,__VA_ARGS__) // 定义LOGD类型
#define LOGI(...) __android_log_print(ANDROID_LOG_INFO,TAG ,__VA_ARGS__) // 定义LOGI类型
#define LOGW(...) __android_log_print(ANDROID_LOG_WARN,TAG ,__VA_ARGS__) // 定义LOGW类型
#define LOGE(...) __android_log_print(ANDROID_LOG_ERROR,TAG ,__VA_ARGS__) // 定义LOGE类型
#define LOGF(...) __android_log_print(ANDROID_LOG_FATAL,TAG ,__VA_ARGS__) // 定义LOGF类型


/**
 * 让C代码调用Java中JNI类的public int add(int x ,int y)
 */
void Java_com_example_myapplication_Api_callbackAdd(JNIEnv *env, jobject jobj) {
//1.得到字节码
//jclass      (*FindClass)(JNIEnv*, const char*);
    jclass jclazz = (*env)->FindClass(env, "com/example/myapplication/Api");
//2.得到方法
//jmethodID   (*GetMethodID)(JNIEnv*, jclass, const char*, const char*);
//最后一个参数是方法签名
    jmethodID jmethodId = (*env)->GetMethodID(env, jclazz, "add", "(II)I");
//3.实例化该类
    jobject jobject1 = (*env)->AllocObject(env, jclazz);
//4.调用方法
//jint        (*CallIntMethod)(JNIEnv*, jobject, jmethodID, ...);
    jint value = (*env)->CallIntMethod(env, jobject1, jmethodId, 99, 1);
//成功调用
    LOGE("value==%d\n", value);
};

/***
 * 让C代码调用
 * public void helloFromJava()
 */
void JNICALL Java_com_example_myapplication_Api_callbackHelloFromJava
(JNIEnv *env, jobject jobj) {
//1.得到字节码
//jclass      (*FindClass)(JNIEnv*, const char*);
jclass jclazz = (*env)->FindClass(env, "com/example/myapplication/Api");
//2.得到方法
//jmethodID   (*GetMethodID)(JNIEnv*, jclass, const char*, const char*);
//最后一个参数是方法签名
jmethodID jmethodIds = (*env)->GetMethodID(env, jclazz, "helloFromJava", "()V");
//3.实例化该类
jobject jobject1 = (*env)->AllocObject(env, jclazz);
//4.调用方法
//jint        (*CallIntMethod)(JNIEnv*, jobject, jmethodID, ...);
(*env)->CallVoidMethod(env, jobject1, jmethodIds);
};

/***
 * 让C代码调用
 * public void printString(String s)
 *
 */
void JNICALL Java_com_example_myapplication_Api_callbackPrintString
(JNIEnv *env, jobject jobj) {
//1.得到字节码
//jclass      (*FindClass)(JNIEnv*, const char*);
jclass jclazz = (*env)->FindClass(env, "com/example/myapplication/Api");
//2.得到方法
//jmethodID   (*GetMethodID)(JNIEnv*, jclass, const char*, const char*);
//最后一个参数是方法签名
jmethodID jmethodIds = (*env)->GetMethodID(env, jclazz, "printString", "(Ljava/lang/String;)V");
//3.实例化该类
jobject jobject1 = (*env)->AllocObject(env, jclazz);
//4.调用方法
//jint        (*CallIntMethod)(JNIEnv*, jobject, jmethodID, ...);
// jstring     (*NewStringUTF)(JNIEnv*, const char*);
jstring jst = (**env).NewStringUTF(env, "I am Android!");
(*env)->CallVoidMethod(env, jobject1, jmethodIds, jst);
};

/**
 * 让C代码调用
 * public static void sayHello(String s)
 *
 */
void JNICALL Java_com_example_myapplication_Api_callbackSayHello
(JNIEnv *env, jobject jobj) {
//1.得到字节码
//jclass      (*FindClass)(JNIEnv*, const char*);
jclass jclazz = (*env)->FindClass(env, "com/example/myapplication/Api");
//2.得到方法
// jmethodID   (*GetStaticMethodID)(JNIEnv*, jclass, const char*, const char*);
//最后一个参数是方法签名
jmethodID jmethodIds = (*env)->GetStaticMethodID(env, jclazz, "sayHello",
                                                 "(Ljava/lang/String;)V");
jstring jst = (**env).NewStringUTF(env, "I am Android!");
(*env)->CallStaticVoidMethod(env, jclazz, jmethodIds, jst);
};

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值