本文基于上文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