在NDK C++线程中如何调用JAVA API

from://http://www.eoeandroid.com/thread-150995-1-1.html

在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, "<init>", "()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();
    }
}

时间: 2024-10-07 04:35:59

在NDK C++线程中如何调用JAVA API的相关文章

jsp中怎么调用java类中的方法

在jsp页面中先要,引入java类 例如: <%@page import="javabean.DbConn"%><!-- 引入包中的"类" --> <!--在用到的地方,直接对类实例化--> <% DbConn  DB=new  DbConn(); %> <!--然后就可以直接调用类中的方法--> <% Connection con=DB.conn(); %> jsp中怎么调用java类中的方法

Unity在Android和iOS中如何调用Native API

本文主要是对unity中如何在Android和iOS中调用Native API进行介绍. 首先unity支持在C#中调用C++ dll,这样可以在Android和iOS中提供C++接口在unity中调用.利用这一特性,可以扩展unity的功能.例如集成和调用第三方库.同时为了满足对unity接口的一致性,可以考虑在android和iOS上提供相同的接口供C#调用. 这里列举以下两个例子. 1. 1. 以弹出一个覆盖部分屏幕的webview为例来说明如何从C#调用Native接口. 2. 2. 简

eclipse 中使用中文JAVA api文档

http://hi.baidu.com/danghj/item/7625a1be20946e43ba0e1202在eclipse中使用中文JAVA api文档Sun 官方的中文版 Java API 文档发布了,地址为: http://gceclub.sun.com.cn/download/Java_Docs/html_zh_CN.zip  , 下载后请参考如下步骤配合 eclipse3.1 使用

JNI中C调用Java方法

背景需求 我们需要在JNI的C代码调用Java代码.实现原理:使用JNI提供的反射借口来反射得到Java方法,进行调用. JNI关键方法讲解. 1. 在同一个类中,调用其他方法 JNIEXPORT void JNICALL Java_cn_itcast_ndkcallback_DataProvider_callmethod1 (JNIEnv * env, jobject obj){ //在c代码里面调用java代码里面的方法 // java 反射 //1 . 找到java代码的 class文件

使用NDK实现Android中C与Java交叉编译

android中的java依托于java虚拟机,运行效率是比较低的,最近在做高效大数乘法中,发现了JNI或者NDK可以实现C与Java混编,并且引用c的动态库,而且android中的C语言不需要依托java虚拟机,效率还是非常高的. 一.开发环境的搭建 开发java的话还是eclipse不变,除此之外下载 android-ndk-r9d-linux-x86_64.tar.bz2(linux),安装方法: $ cd android-ndk-r9d/ $ build/tools/make-stand

oracle中触发器调用Java程序

1. 写一个Java程序,Java程序的目录是:E:\APP\test\src\test\Main.java 2. 在环境变量Path中配置,E:\studyInstallPath\oracle\BIN 3. 在E:\APP\test\src\test这个目录下执行 4. 5. 创建存储过程 create or replace procedure testmodify(name varchar2) as language Java name 'Main.modify(java.lang.Stri

Eclipse中无法查看java api的源代码

简述 1. Mac OS(10.8版本)自带了jdk1.6或者说java6,但是没有源代码.Mac OS自带的java 6是由苹果负责发布和更新的,跟Oracle的java 6略有不同,比如没有rt.jar,取而代之的是classes.jar 其他一些详细信息可参考 http://my.oschina.net/hmj/blog/79939 2. Oracle官方没有提供给Mac OS使用的java 6,但是从Orace官网可以下载java 7及源代码 ,Oracle官方提供了详细的安装指南,本文

关于WP8.1开发中,调用网络API接口时JSON无法反序列化的解决方法

分享一个自动生成json的C#对象的方法网址: http://tools.wx6.org/json2csharp/ 复制后就在项目中新建一个类,类名可以按照自动生成的Root,也可以自定义,自定义的话,别忘了修改复制的类名 如自定义类名为C,则把Root改成C 关于复杂的嵌套JSON,要记住:集合中不要放集合,要构建对象来放集合,这样才能在绑定数据时调用 反序列化推荐用json.net这个开源库,引用时注意要用WinRt中的json.dll 然后用Root r=JsonConvert.Deser

CocosCreator 中 JS 与 Java 互相调用方式和注意事项

JS 调用 Java 方法在 CocosCreator 下 JS 调用 Java/Objective-C 的格式都是: var o = jsb.reflection.callStaticMethod(className, methodName, methodSignature, parameters...)JS 只能调用 Java 中的静态方法,需要传入类名.方法名.方法签名.方法参数,并且可以获得返回值. 类名类名必须是包含 Java 包路径的完整类名,而且用斜线 / 代替点 . ,例如 co