Pich Blog

关注移动开发,大数据,云计算,软件架构!

6.JNI和Java方法互调

概述

JNI调用java方法

先通过类名找到java类,然后根据方法签名找到方法id,最后调用,如果是非静态方法需要构造出对象。

JNI调用静态方法

声明静态方法

实现静态方法

c++
//test.cpp
#include <stdio.h>

//经测试,如果java,调用jni,不用头文件,会找不到实现的方法
#include "cn_woblog_testjnicallmethod_MainActivity.h"

//调用Java方法
void callJavaMethod(JNIEnv *env, jobject thiz){
//根据类名找到类
jclass clazz =env->FindClass("cn/woblog/testjnicallmethod/MainActivity");
if(clazz==NULL){
printf("find class error!");
return;
}

//根据签名找到方法id
jmethodID id=env->GetStaticMethodID(clazz,"methodCalledByJNI","(Ljava/lang/String;)V");
if(id==NULL){
printf("find method id error!");
return;
}

//调用方法
jstring msg=env->NewStringUTF("I am jni message");
env->CallStaticVoidMethod(clazz,id,msg);
}

//java 调用该方法
JNIEXPORT jstring JNICALL Java_cn_woblog_testjnicallmethod_MainActivity_get
(JNIEnv *env, jobject thiz){
printf("invoke get from C++\n");
callJavaMethod(env,thiz);
return env->NewStringUTF("Hello from JNI!");
}

<pre><code><br />### 在activity中调用jni方法

java
TextView tv= (TextView) findViewById(R.id.tv);
tv.setText(get());

可以看到上面完成了一个在java中调用jni,jni又调用java方法的过程。

点赞

发表评论

电子邮件地址不会被公开。 必填项已用*标注