JniHelper java和c++互相调用

假设两边文件为:
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);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值