直接上代码:
JnicallbackActivity.java
package com.app.test;
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
public class JnicallbackActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
JniMethod obj=new JniMethod();
obj.setCallBack();
}
}
JniMethod.java
package com.app.test;
import android.util.Log;
public class JniMethod {
static {
System.loadLibrary("callback");
}
public native void setCallBack();
public void callback(int len)
{
Log.v("bb","JNI传回的值===="+len);
}
}
callback.c
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/ioctl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <jni.h>
#include <android/log.h>
/**********传输整数*************
*/
JNIEXPORT void JNICALL Java_com_app_test_JniMethod_setCallBack(JNIEnv* env,jobject obj)
{
//找到java中的类
jclass cls = (*env)->FindClass(env, "com/app/test/JniMethod");//首先找到被回调函数所在的类 FindClass
//再找类中的方法
jmethodID mid = (*env)->GetMethodID(env, cls, "callback", "(I)V");//然后找到这个方法 GetMethodID
if (mid == NULL)
{
return;
}
//回调java中的方法
int i;
for(i=0;i<20;i++){
(*env)->CallVoidMethod(env, obj, mid ,i);//Call<被回调函数的返回类型>Method 执行回调
}
}
Android.mk
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE :=callback
LOCAL_SRC_FILES:=callback.c
include $(BUILD_SHARED_LIBRARY)
注意事项:
1,声明的native函数在Jni中的函数体所回调的函数必须同其在一个类中(如上 执行回调的setCallBack和被回调的callback函数都在同一个类中)
2,,native函数不能修饰为static,被回调 的函数也不能被修饰为static,具体原因不详