在第一章的测试NDK时实现了Java层调用native层,这里再来实现native层调用Java层,触发的条件是Java层调用native层时native调用Java
1.Java中代码
package com.example.shibo.testndk1;
import android.content.Context;
import android.util.Log;
/**
* Created by shibo on 2017/3/22.
*/
public class JniManage {
/**
* native调用Java的方法
*/
public static void nativeToJava(){
Log.e("nativeToJava","Success");
}
static {
System.loadLibrary("testNdk");
}
/**
* Java调用native的方法
*/
public native String getStringByJni();
}
2.navive层代码
//
// Created by 石博 on 2017/3/22.
//
#include <jni.h>
#include <android/log.h>
#ifndef LOG_TAG
#define LOG_TAG"ANDROID_LAB"
#define LOGE(...) __android_log_print(ANDROID_LOG_ERROR,LOG_TAG,__VA_ARGS__)
#endif
/* Header for class lab_sodino_jnitest_MainActivity */
#ifndef _Included_com_example_shibo_testndk1_JniManage
#define _Included_com_example_shibo_testndk1_JniManage
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class:lab_sodino_jnitest_MainActivity
* Method: getStringFromNative
* Signature: ()Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_com_example_shibo_testndk1_JniManage_getStringByJni
(JNIEnv *env, jobject jObj){
//在Java层调用该方法的时候,nativie去调用Java中的方法
jclass jclass1 = (*env)->FindClass(env,"com/example/shibo/testndk1/JniManage");
//jclass jclass1 = (*env)->FindClass("com/example/shibo/testndk1/JniManage");==c++
jmethodID jmethodID1=(*env)->GetStaticMethodID(env,jclass1,"nativeToJava","()V");
// jmethodID jmethodID1=(*env)->GetStaticMethodID(jclass1, "getStringByJni","()V");==c++
(*env)->CallStaticVoidMethod(env,jclass1,jmethodID1);
//env->CallStaticVoidMethod(jclass1,jmethodID1);==c++
LOGE("log string from ndk.");
return (*env)->NewStringUTF(env,"HelloFrom JNI!");
}
#ifdef __cplusplus
}
#endif
#endif
3.测试结果
可以看到,在调用native成功之前调用了Java的方法。