c/c++本地代码调用java,一般是本地代码没有接口实现某个功能或者实现起来很麻烦,而java直接有这样的接口。这时候会用到c++ 调用java来获取结果,下面是几个简单的实例
1. java代码:
package com.miles;
import android.content.Context;
import android.provider.Settings;
import android.util.Log;
public class Test {
static {
System.loadLibrary("native-lib");
}
public static boolean getBoolean()
{
return true;
}
public static String getString()
{
return "String";
}
public static int getInt()
{
return 666;
}
public void onProgress(int progress)
{
Log.i("cur progress:"+progress);
}
}
2.C++部分:
void getString(JNIEnv *env) {
1. 获取到类
jclass TestClass= env->FindClass("com/miles/Test");
2. 根据类跟方法名,方法签名获取到方法ID
jmethodID getString
= env->GetStaticMethodID(skeletonClass, "getString", "()Ljava/lang/String;");
jmethodID getBool = env->GetStaticMethodID(skeletonClass, "getBoolean", "()Z");
jmethodID getInt = env->GetStaticMethodID(skeletonClass, "getInt", "()I");
3.根据类,方法ID调用方法,并获取返回值
jstring stringInfo = (jstring)env->CallStaticObjectMethod(skeletonClass, getString);
if(stringInfo == NULL)
{
LOGE("failed to get getString");
return false;
}
jboolean boolInfo_ = (jboolean)env->CallStaticBooleanMethod(skeletonClass, getBool);
jint intInfo_ = (jint)env->CallStaticIntMethod(skeletonClass, getInt);
//转成c++的char*型
const char *charInfo= gJNIClassEnv->GetStringUTFChars(stringInfo , 0);
//使用完获取到的值后释放资源
gJNIClassEnv->ReleaseStringUTFChars(stringInfo, charInfo);
}
//************************************************************************************
JNIEnv* gEnv;
jclass globalClass;
JavaVM* jvm;
void init()
{
gEnv = env;
jclass localClass = env->FindClass("com/miles/Test");
globalClass = reinterpret_cast<jclass>(env->NewGlobalRef(localClass));
env->GetJavaVM(&jvm);
}
void native_onProgress(JNIEnv *env)
{
jvm->AttachCurrentThread(&gEnv, NULL);
jmethodID mid = (gEnv)->GetMethodID(globalClass, "onProgressUpdate", "(I)V");
if (mid == NULL) {
LOGI("get onProgressUpdate method id error!\n");
}
jobject jobject = gEnv->AllocObject(globalClass);
(gEnv)->CallVoidMethod(jobject, mid, (jint)progress);
}