您的位置:首页 > 编程语言 > C语言/C++

JniHelper java和c++互相调用

2014-01-27 12:17 411 查看
假设两边文件为:

JniUtil.cpp 和 Jutil.java

Jutil.java里面 ---

包名为com.abc.game

方法:

public static void test1() {

// ….

}

public void test2() {

// ….

}

--

在JniUtil.cpp中调用java的方法

1. 调用静态方法

JniMethodInfo minfo;

bool isHave = JniHelper::getStaticMethodInfo(minfo, "com/abc/game/Jutil", "test1", "()V");

if (isHave) {

minfo.env->CallStaticVoidMethod(minfo.classID, minfo.methodID);

}

2. 调用实例方法

JniMethodInfo minfo;

// 需要先获取实例对象

bool isHave = JniHelper::getStaticMethodInfo(minfo, "com/abc/game/Jutil", "getInstance", "()Ljava/lang/Object;");

object job;

if (isHave) {

jobj = minfo.env->CallStaticObjectMethod(minfo.classID, minfo.methodID);

}

isHave = JniHelper::getMethodInfo(minfo, "com/abc/game/Jutil", "test2", "()V");

if (isHave) {

minfo.env->CallVoidMethod(jobj, minfo.methodID);

}

在Jutil.java中调用JniUtil.cpp的方法

在Jutil.java中声明

private static native void test3(int i);

在JniUtil.cpp中定义

extern "C"

{

void Java_com_abc_game_Jutil_test3(JNIEnv *env, jobject thiz, jint a)

{

// ….

}

}

然后在Jutil.java中便可以调用

test3(1);

如果是传递多参数或字符串,如下

在Jutil.java中声明

private static native void test3(int i, String s);

在JniUtil.cpp中定义

extern "C"

{

void Java_com_abc_game_Jutil_test3(JNIEnv *env, jobject thiz, jint i, jstring s)

{

// ….

const char *string = env->GetStringUTFChars(s, 0);

// use the string

evn->ReleaseStringUTFChars(s, string);

}

}

* 遇到error: base operand of '->' has non-pointer type 'JNIEnv {aka _JNIEnv}'

是因为'JNIEnv在c和c++下的宏定义不同

把使用于c的语法:const char *string = (*env)->GetStringUTFChars(env, s, 0);

改为适用于c++的语法:const char *string = env->GetStringUTFChars(s, 0);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: