JniHelper java和c++互相调用
来源:互联网 发布:数据库开发软件 编辑:程序博客网 时间:2024/06/05 06:42
假设两边文件为:
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中便可以调用
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);
0 0
- JniHelper java和c++互相调用
- C++ 和 C 互相调用
- Android JNI之Java和C互相调用
- JNI学习(一)(c和java层对象互相调用)
- java和python互相调用
- java和python互相调用
- java和python互相调用
- Java与C互相调用实例详解
- Java与C互相调用实例详解
- java c/cpp互相调用实例
- JNI JAVA与C的互相调用
- java c/cpp互相调用实例----------c/cpp调用java
- C和C++中如何互相调用
- C语言和AAuto互相调用函数
- C和lua的互相调用
- linux下c和c++互相调用
- Lua和C的互相调用
- 关于c和c++互相调用
- sort command
- 阿里云服务器centos6.3进行php升级(从5.3.3 -> 5.5.8)
- cocos2dx3.0下sqlite的C++与lua绑定
- 神之惩戒—-MMORPG的困局
- unity3d学习笔记(十三)--如何拦截射线碰撞界面的消息
- JniHelper java和c++互相调用
- 《黑马程序员》枚举及自动装箱和拆箱
- 内部类
- [Small Game]Gluttonous Snake-V2.0
- Youtube 视频下载
- notepad++插件
- INF文件帮助文档
- uva 607 - Scheduling Lectures
- Android Call requires API level 11 (current min is 8)的解决方案