c调用java 中的方法
c代码中通过反射得到java 对象
1.新建Java类
public class CCallJava {
static {
System.loadLibrary("CCallJava");
}
public native void callBack();
public native int callBackForJni();
public int add(int x, int y) {
int z = x + y;
Log.e("CCallJava", "-----x+y="+z);
return z;
}
}
2新建C文件
#include <jni.h>
JNIEXPORT jint JNICALL
Java_com_lixinxin_leeroomdemo_jni_CCallJava_callBackForJni(JNIEnv *env, jobject instance) {
//1.加载类 得到class 对象
jclass jc = (*env)->FindClass(env, "com/lixinxin/leeroomdemo/jni/CCallJava");
//2.得到对应方法的 Method 对象
jmethodID jmethodID1 = (*env)->GetMethodID(env, jc, "add", "(II)I");
//3.创建对象
jobject jobject1 = (*env)->AllocObject(env, jc);
//4.调用方法
jint z = (*env)->CallIntMethod(env, jobject1, jmethodID1, 99, 1);
return z;
}
获取Java方法的签名 javap -s 类的全路径
3 调用
CCallJava cCallJava=new CCallJava();
textView.setText("结果"+cCallJava.callBackForJni());
4 c 调用java 的静态方法
JNIEXPORT jint JNICALL
Java_com_lixinxin_leeroomdemo_jni_CCallJava_callJavaStatic(JNIEnv *env, jobject instance) {
//1.加载类 得到class 对象
jclass jc = (*env)->FindClass(env, "com/lixinxin/leeroomdemo/jni/CCallJava");
//2.得到对应方法的 Method 对象
jmethodID jmethodID1 = (*env)->GetStaticMethodID(env, jc, "getStringSize", "(Ljava/lang/String;)I");
//3.调用方法
jstring str = (*env)->NewStringUTF(env, "lixinxin");
jint z = (*env)->CallStaticIntMethod(env, jc,jmethodID1, str);
return z;
}
网友评论