本文的主要内容:C++中调用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);
}