1、jni普通方法中回调java方法
static void android_server_LSPowerService_set_acc_callback(JNIEnv* env, jobject obj,jstring name) {
Mutex::Autolock l(sLock);
const String8 nameString = Utility::getStringValue(env, name);
jclass localRef = env->GetObjectClass(obj);
jmethodID methodId = env->GetMethodID(localRef, nameString.string(), "(I)V");
env->CallVoidMethod(obj, methodId, cAccStatus);
}
2、jni线程中回调java方法
由于java调用jni时传递的JNIEnv和jobject会在jni返回时被释放,因此需要使用的参数申请全局的变量使用。可以参考如下例子:
#define LOG_TAG "LSPowerServicejni"
#include "jni.h"
#include "JNIHelp.h"
#include "android_runtime/AndroidRuntime.h"
#include <utils/Log.h>
#include <ls/app_comm.h>
#include <stdio.h>
#include <pthread.h>
#include <sys/select.h>
namespace android
{ class Utility {
public:
static String8 getStringValue(JNIEnv* env, jobject object, const char* fieldName);
static char* getByteArrayValue(
JNIEnv* env, jobject object, const char* fieldName, int* dataLength);
static char* getByteArrayValue(
JNIEnv* env, jbyteArray byteArray, int* dataLength);
static String8 getStringValue(JNIEnv* env, jstring string);
static int getIntValue(JNIEnv* env, jobject object, const char* fieldName);
};
String8 Utility::getStringValue(JNIEnv* env, jobject object, const char* fieldName) {
/* Look for the instance field with the name fieldName */
jfieldID fieldID
= env->GetFieldID(env->GetObjectClass(object), fieldName , "Ljava/lang/String;");
if (NULL != fieldID) {
jstring valueString = (jstring) env->GetObjectField(object, fieldID);
return Utility::getStringValue(env, valueString);
}
String8 dataString("");
return dataString;
}