JNI调用Java中的静态非静态方法

本文基于上文JNI获取并修改Java中类的变量和静态变量的值

本文用到的方法:
Call< Type>Method, CallStatic< Type>Method
案例:
JniDemo.java添加一个静态一个非静态方法
    //执行方法
    public native void accessMethod();
    //执行静态方法
    public native void accessStaticMethod();


    public void printMessage(int message){
        Log.i(TAG, "printMessage: " + message);
    }

    public static void printLog(String log){
        Log.i(TAG, "printLog: " + log);
    }
com_test_git_jnidemo_JniUtil_JniDemo.h文件添加
JNIEXPORT void JNICALL Java_com_test_git_jnidemo_JniUtil_JniDemo_accessMethod
  (JNIEnv *, jobject);

JNIEXPORT void JNICALL Java_com_test_git_jnidemo_JniUtil_JniDemo_accessStaticMethod
  (JNIEnv *, jobject);
JNIDemo.cpp
调用Java中非静态方法

对于方法的签名可以参考:JNI类型

JNIEXPORT void JNICALL Java_com_test_git_jnidemo_JniUtil_JniDemo_accessMethod
        (JNIEnv *env, jobject jobj){
    //1.获取jclass
    jclass cls = env->GetObjectClass(jobj);
    //2.获取方法的ID
    //clazz为上面获取到的cls, name为java中的方法名, sig为方法的签名
    //jmethodID GetMethodID(jclass clazz, const char* name, const char* sig)
    jmethodID mid = env->GetMethodID(cls, "printMessage", "(I)V");
    //3.调用printfMessage方法并传递参数
    env->CallVoidMethod(jobj, mid, 10);
};
调用Java中静态方法
JNIEXPORT void JNICALL Java_com_test_git_jnidemo_JniUtil_JniDemo_accessStaticMethod
        (JNIEnv *env, jobject jobj){
    //1.获取jclass方法
    jclass  cls = env->GetObjectClass(jobj);
    //2.获取静态方法的ID
    //clazz为上面获取到的cls, name为java中的静态方法的方法名, sig为方法的签名
    //jmethodID GetStaticMethodID(jclass clazz, const char* name, const char* sig)
    jmethodID mid = env->GetStaticMethodID(cls, "printLog", "(Ljava/lang/String;)V");
    jstring jstr = env->NewStringUTF("JNI invoke Java Static Method");
    //3.调用printLog方法并传递参数
    //env->CallStaticVoidMethod(cls, mid, "JNI invoke Java Static Method");会报错,这种方法不允许
    //所以String参数需要通过NewStringUTF生成jstring使用
    env->CallStaticVoidMethod(cls, mid, jstr);
};
MainActivity.java调用
jd.accessMethod();
jd.accessStaticMethod();

输出结果:

09-24 15:08:32.274 1423-1423/com.test.git.jnidemo I/JniDemo: printMessage: 10
09-24 15:08:32.274 1423-1423/com.test.git.jnidemo I/JniDemo: printLog: JNI invoke Java Static Method
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值