http://stackoverflow.com/questions/8530924/how-to-call-java-api-from-ndk-c-thread

http://www.cnblogs.com/wanqieddy/p/4303531.html

http://android.wooyd.org/JNIExample/files/JNIExample.tar.gz

http://my.oschina.net/ososchina/blog/367559?fromerr=Y6zm54rr

在NDK中创建的线程中, 只允许调用静态的Java API. 当在线程中调用env->FindClass(), 系统就会发出异常.

http://android.wooyd.org/JNIExample 中有较详细的调用说明.
示例代码如下:

JAVA 代码:
public class simple_test extends Activity {
    ...
    public static void PrintNdkLog(String slog) {
        Log.e("NDK", slog);
    }
}
        
C++ 代码:

static JavaVM* g_JavaVM = NULL;
static jobject g_InterfaceObject = 0;

static void GetInterfaceObject(JNIEnv *env, const char *path, jobject *objptr) {
    jclass cls = env->FindClass(path);
    if(!cls) {
        return;
    }
    jmethodID constr = env->GetMethodID(cls, "", "()V");
    if(!constr) {
        return;
    }
    jobject obj = env->NewObject(cls, constr);
    if(!obj) {
        return;
    }
    (*objptr) = env->NewGlobalRef(obj);
}

int JniLoad(JavaVM* jvm, void* reserved)
{
    g_JavaVM = jvm;

    JNIEnv *env;
    if (jvm->GetEnv((void**) &env, JNI_VERSION_1_6) != JNI_OK) {
        return -1;
    }

    GetInterfaceObject(env, "com/myndk/simple_test", &g_InterfaceObject);
    return JNI_VERSION_1_6;
}

void JniUnLoad(JavaVM* jvm, void* reserved)
{
    JNIEnv *env;
    if (jvm->GetEnv((void**) &env, JNI_VERSION_1_6) != JNI_OK) {
        return;
    }

    env->DeleteGlobalRef(g_InterfaceObject);
}

void PrintNdkLog(const char *format, ...)
{
    va_list arg_ptr;
    char sLogBuff[1024];

    va_start(arg_ptr, format);
    vsprintf(sLogBuff, format, arg_ptr);
    va_end(arg_ptr);

    if (g_JavaVM == NULL)
        return;

    int status;
    JNIEnv *env = NULL;
    bool isAttached = false;

    status = g_JavaVM->GetEnv((void**) &env, JNI_VERSION_1_6);
    if(status < 0)
    {
        status = g_JavaVM->AttachCurrentThread(&env, NULL);
        if(status < 0)
        {
            return;
        }
        isAttached = true;
    }

    jclass cls = env->GetObjectClass(g_InterfaceObject);
    if (cls != 0)
    {
        jmethodID mid = env->GetStaticMethodID(cls, "PrintNdkLog", "(Ljava/lang/String;)V");
        if (mid != 0)
        {
            jstring jstrMSG = env->NewStringUTF(sLogBuff);
            env->CallStaticVoidMethod(cls, mid, jstrMSG);
        }
    }

    if (isAttached)        // From native thread
    {
        g_JavaVM->DetachCurrentThread();
    }
}

更多相关文章

  1. Android应用程序启动过程源代码分析(2)
  2. android通过google api获取天气信息示例
  3. Android引路蜂地图开发示例:放大、缩小
  4. Android 代码里设置ImageView的src和background
  5. Android简单文件浏览器源代码

随机推荐

  1. android8.0/android O 新特性
  2. MAC查看某一so文件的cpu匹配
  3. android集成 ijkplayer Ijkplayer集成使
  4. Android(安卓)标题有点难写啊
  5. 证书番外篇之Android证书
  6. Android浏览器Browser二次开发(二)支持WM
  7. Android入门笔记 - 数据存储 - 网络
  8. ReactNative调用android原生View
  9. android Server及IntentServer
  10. Android(安卓)Paging分页库的学习(一)——