java层代码:
package com.myjni;
public class MyTestJni {
static {
System.loadLibrary("MyTestJni");
}
public native void Init();
public native int SetCallback(int tInputId);
public void onNativeCallback(int tInputId, int tInputArg, String tInputString)
{
System.out.println("damon ===> native callback : "+tInputId + " , "+tInputArg+" , "+tInputString);
}
public MyTestJni()
{
Init();
}
}
jni接口代码:
static JavaVM *pXJavaVm=NULL;
static jobject tXJavaObject;
//回调函数的处理
static void MyTestCallback(int tInputId, int tInputArg, const char *pInputString)
{
JNIEnv *pTempEnv;
//ALOGD(“damon ===> callback : %d %d - %s \n”, tInputId, tInputArg, pInputString);
if(pXJavaVm==NULL)
return ;
pXJavaVm->AttachCurrentThread(&pTempEnv, NULL);
if(pTempEnv==NULL)
return ;
jclass tTempJavaClass=pTempEnv->GetObjectClass(tXJavaObject);
if(tTempJavaClass==NULL)
{
ALOGD("damon ===> fail to find java class !\n");
return ;
}
jmethodID tTempJavaCallback=pTempEnv->GetMethodID(tTempJavaClass, "onNativeCallback", "(IILjava/lang/String;)V");
if(tTempJavaCallback==NULL)
{
ALOGD("damon ===> fail to find method onNativeCallback !\n");
return ;
}
jstring tTempString=pTempEnv->NewStringUTF(pInputString);
pTempEnv->CallVoidMethod(tXJavaObject, tTempJavaCallback, tInputId, tInputArg, tTempString);
pTempEnv->DeleteLocalRef(tTempString);
pXJavaVm->DetachCurrentThread();
}
/*
* Class: com_myjni_TestJni
* Method: Init
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_com_myjni_TestJni_Init
(JNIEnv *pInputEnv, jobject tInputObj)
{
pInputEnv->GetJavaVM(&pXJavaVm);
tXJavaObject=pInputEnv->NewGlobalRef(tInputObj);
}
/*
* Class: com_myjni_TestJni
* Method: SetCallback
* Signature: (I)I
*/
JNIEXPORT jint JNICALL Java_com_myjni_TestJni_SetCallback
(JNIEnv *pInputEnv, jobject tInputObj, jint tInputId)
{
return (jint)XSetCallback(tInputId, MyTestCallback);
}