【JNI开发】C++调用java函数的实现方法
2014-03-19 11:38
776 查看
本文的主要内容:C++中调用java类的成员函数和静态成员函数
1,java代码
2,c++代码
调用成员函数
调用静态成员函数
【注意】
在调用java类的成员函数时,一定要调用构造函数实例化java类
1,java代码
public class SNaviEngineManager { public void sendMessage(int msg) { } public static int sendMessage(int msg) { } }
2,c++代码
调用成员函数
void ms_sendmessage(int msg) { // 获取JNI环境 bool attach = false; int status=0; JNIEnv* pEnv = NULL; status = g_jvm->GetEnv((void **) &pEnv, JNI_VERSION_1_6); if( status < 0 ) { LOGI("AttachCurrentThread"); g_jvm->AttachCurrentThread(&pEnv, NULL); attach = true; } jmethodID mid = pEnv->GetMethodID( g_jcNaviEngine, "<init>", "()V"); jobject obj = pEnv->NewObject( g_jcNaviEngine, mid); if (obj == 0) { LOGE("Create object failed!"); } // 调用成员方法 mid = pEnv->GetMethodID( g_jcNaviEngine, "sendMessage", "(I)V"); if (mid != 0) { pEnv->CallVoidMethod( obj, mid, msg ); } // 释放JNI环境 if( attach ) { g_jvm->DetachCurrentThread(); } }
调用静态成员函数
void ms_sendmessage(int msg) { // 获取JNI环境 bool attach = false; int status=0; JNIEnv* pEnv = NULL; status = g_jvm->GetEnv((void **) &pEnv, JNI_VERSION_1_6); if( status < 0 ) { LOGI("AttachCurrentThread"); g_jvm->AttachCurrentThread(&pEnv, NULL); attach = true; } // 调用静态成员方法 jmethodID mid = pEnv->GetStaticMethodID( static_cast<jclass>(g_joNaviEngine), "sendMessage", "(I)V"); if (mid != 0) { pEnv->CallStaticVoidMethod( obj, mid, msg ); } // 释放JNI环境 if( attach ) { g_jvm->DetachCurrentThread(); } }
【注意】
在调用java类的成员函数时,一定要调用构造函数实例化java类
/** 实例化类对象 */ jobject getInstance( JNIEnv* pEnv , jclass classzz ) { if ( pEnv == NULL ) { return NULL ; } // 获取构造方法 jmethodID constructor = pEnv->GetMethodID(classzz, "<init>", "()V"); if (NULL == constructor) { return NULL; } // 实例化类对象 return pEnv->NewObject(classzz, constructor); }
相关文章推荐
- Android Studio Jni开发(二)实现Native调用java方法和Native调用Android API
- Android(安卓)开发通过NDK调用JNI,使用opencv做本地c++代码开发配置方法实现边缘检测代码(2)
- Android-使用C++实现调用本地方法返回字符串显示在界面上/NDK-JNI开发实例(八)
- Android-NDK开发之基础--Android JNI实例代码(一)-- 在JNI中执行Java方法--C/C++调用Java
- Java通过调用C/C++实现的DLL动态库――JNI的方法
- Android开发 通过JNI实现JAVA与C/C++程序间的调用和回调
- 利用JNI在vs2010上实现c++调用Java类方法
- 安卓应用开发通过java调用c++ jni的图文使用方法
- Android JNI/NDK开发(2)JNI实现C/C++与Android/JAVA相互调用
- Android-NDK开发之基础--Android JNI实例代码(一)-- 在JNI中执行Java方法--C/C++调用Java
- eclipse JNI示例。利用C/C++实现JAVA中调用的函数
- Android-NDK开发之基础--Android JNI实例代码(一)-- 在JNI中执行Java方法--C/C++调用Java
- java JNI 实例 实现调用c++函数
- JAVA用JNI方法调用C代码实现HelloWorld
- cocos2dx 使用jni实现java调用c++
- JAVA通过JNI调用c++本地方法dll
- Eclipse、MinGW、JNI编写C++生成dll, Java端调用的完整示例(附java.lang.UnsatisfiedLinkError解决方法)
- 【学习Android NDK开发】native code通过JNI调用Java方法
- java开发第二个jni示例程序(基于linux操作系统)--native层调用java方法
- cocos2d-x中通过Jni实现Java与C++的互相调用