#define LOGV(...)__android_log_print(ANDROID_LOG_VERBOSE, LOG_TAG,__VA_ARGS__)
#define LOGW(...)__android_log_print(ANDROID_LOG_WARN, LOG_TAG, __VA_ARGS__)
#define LOGI(...)__android_log_print(ANDROID_LOG_INFO, LOG_TAG, __VA_ARGS__)
#define LOGD(...)__android_log_print(ANDROID_LOG_DEBUG, LOG_TAG,__VA_ARGS__)
#define LOGE(...)__android_log_print(ANDROID_LOG_ERROR, LOG_TAG,__VA_ARGS__)
4.引用及獲得方法ID:
static jint jni_init(JNIEnv *env, jobjectthiz)
{
LOGV("jni_init.");
g_thiz =(jobject)env->NewGlobalRef(thiz);
jclass clazz =env->GetObjectClass(g_thiz);
g_testid = env->GetMethodID(clazz, "test","()V");
// id =env->GetMethodID(clazz,"<init>", "()V");//類構造函數(shù)ID
return 0;
}
釋放:
env->DeleteGlobalRef(g_thiz);
5.調用Java函數(shù):
if((g_thiz != NULL)&& (g_testid !=NULL))
{
env->CallVoidMethod(g_thiz, g_testid);
}
6.同步鎖:
Java:
synchronized (obj)
{
// A
}
synchronized(obj)
{
// B
}
C/C++
env->MonitorEnter(obj);
// A
env->MonitorExit(obj);
7.JNI加載
Java:
public class MainActivity extendsActivity
{
static
{
System.loadLibrary("test");// 加載:libtest.so
}
private native int jni_init(); //定義的native方法
}
JNI:
#define kClassPathName "com/test/MainActivity"
static jint jni_init(JNIEnv *env,jobject thiz)
{
LOGV("jni_init.");
return 0;
}
static JNINativeMethod gMethods[]=
{
{"jni_init", "()I", (void *)jni_init},
};
static int register_Methods(JNIEnv*env)
{
jclass clazz = NULL;
clazz = env->FindClass(kClassPathName);
if(clazz == NULL)
{
LOGE("Native registrationunable to find class '%s'\n", kClassPathName);
return -1;
}
if(env->RegisterNatives(clazz, gMethods,sizeof(gMethods)/sizeof(gMethods[0])) <0)
{
LOGE("RegisterNatives failedfor '%s'\n", kClassPathName);
return -1;
}
return 0;
}
jint JNI_OnLoad(JavaVM* vm, void*reserved)
{
LOGV("JNI_OnLoad.");
JNIEnv *env = NULL;
jint result = -1;
if(vm->GetEnv((void**)&env, JNI_VERSION_1_4) != JNI_OK)
{
LOGE("ERROR: GetEnvfailed\n");
goto bail;
}
if(register_Methods(env)< 0)
{
LOGE("ERROR: native methods registrationfailed\n");
goto bail;
}
result = JNI_VERSION_1_4;
bail:
return result;
}
void JNI_OnUnload(JavaVM* vm, void*reserved)
{
LOGV("JNI_OnUnLoad.");
}
8.Android.mk最簡單的示例:
LOCAL_PATH:= $(callmy-dir)
include $(CLEAR_VARS)
LOCAL_MODULE_TAGS := test
LOCAL_C_INCLUDES:=
LOCAL_SRC_FILES:= \
test.cpp
# 鏈接