JNI 回调小记

javah在eclipse中设置参数:location(javah.exe的位置)working dir(${project_loc}/src)

-classpath .;./classes -d ${project_loc}\jni -jni ${java_type_name}

回调的java代码

public class HelloWorld {
    static {
        System.loadLibrary("jnidemo");
    }

    public void myCallbackFunc(String nMsg) {
        Log.v("EagleTag", "back message:" + nMsg);
    }

    private void throwException() throws NullPointerException {
        throw new NullPointerException("Null pointer");
    }

    public native String DisplayHello(String inputStr);
}

C代码

jstring JNICALL Java_com_example_jnidemo_HelloWorld_DisplayHello(JNIEnv *env,
        jobject obj, jstring what) {
    const jbyte *l_what;
    char *result;

    l_what = (*env)->GetStringUTFChars(env, what, NULL);
    if (l_what == NULL) {
        return NULL; /* OutOfMemoryError already thrown */
    }

    result = malloc(strlen(l_what) + 6);
    if (result == NULL) {
        return NULL;
    }
    sprintf(result, "中文reiver %s", l_what);

    //回调
    char tChar[256];
    gJniClass = 0;
    gJinMethod = 0;

    gJniClass = (*env)->GetObjectClass(env, obj);
    if (gJniClass == 0 || gJniClass == NULL)
        return (*env)->NewStringUTF(env, "-1");

    gJinMethod = (*env)->GetMethodID(env, gJniClass, "myCallbackFunc",
            "(Ljava/lang/String;)V");
    if (gJinMethod == 0 || gJinMethod == NULL)
        return (*env)->NewStringUTF(env, "-2");

    strcpy(tChar, result);
    (*env)->CallVoidMethod(env, obj, gJinMethod,
            (*env)->NewStringUTF(env, tChar));

    return (*env)->NewStringUTF(env, result);
}

JNI 回调小记

时间: 2024-10-13 21:42:20

JNI 回调小记的相关文章

jni回调多线程问题

解决jni回调不同线程获取jvm问题 原文地址:https://blog.51cto.com/lindt/2472103

android使用c通过jni回调java

很多场合都有这样的需求,由于以前都是java调用c的接口,没有做过回调,今天花了大半天时间把这个流程跑通了,记录一下,以备后用.这里发句牢骚,那些网上分享出来的代码,请问你们确实是能正常工作吗?还有查来查去都是那几份,大家转载精神可嘉啊 jni相关头文件代码 /* DO NOT EDIT THIS FILE - it is machine generated */ #include /* Header for class com_example_ndktest_CallbackTest */ #

JNI回调时线程安全的处理

在网上能找到有关 "在Jni中通过 env->CallStaticVoidMethod去做callback的时候,总会挂掉 原因是JniEnv是和线程相关的,只能在对应创建的线程中使用 而JVM却是进程相关的,可以通过JVM来获取线程相关的JNIENV." 关于这个的解决办法,能搜到的都基本一模一样.变量名都不带改的. 比如:http://blog.chinaunix.net/uid-21564437-id-3343209.html http://my.oschina.net/u

Android jni/ndk编程三:native访问java

一.访问静态字段 Java层的field和method,不管它是public,还是package.private和protected,从 JNI都可以访问到,Java面向语言的封装性不见了. 静态字段和非静态的字段访问方式不同,jni规范提供了一系列带static标示的访问静态字段的函数: jobject (*GetStaticObjectField)(JNIEnv*, jclass, jfieldID); jboolean (*GetStaticBooleanField)(JNIEnv*, j

谷歌广告Admob在cocos2dx上通过回调实现底部Banner

首先说明我的开发平台,以免由于平台问题造成不必要的误解: cocos2dx-3.4 ndk-r9d eclipse Admob是谷歌官方广告,已经集成在google_play_service_lib包里面,这里给出百度云下载地址,大家也可以使用官方提供的包. 下载包之后导入到eclipse,将刚导入的项目添加到自己的项目(本文中的项目是AdmobDemo)中做依赖,如下图 然后添加以下代码到AdmobDemo的Manifest.xml的<application>下: <meta-data

Android存储子系统

这篇文章主要是分析Android存储向关联的一些模块,这个分析主要从大的工作流程和代码模块分析,没有对于没有分析到地方后续遇到后在详细分析.主要从以下几个模块分析 系统分区的挂载.外部分区挂载.Vold守候进程分.MountService的业务分析.Sdcard的详细分析.MTP模式分析和设备存储空间的监控机制. 系统分区挂载 Android是基于linux内核的系统,遵从linux的文件系统的挂载方式.在Android中在init进程负责挂载常用的system,data,cache等分区.In

Android开发实践:利用ProGuard进行代码混淆

由于Android的代码大都是Java代码,所以挺容易被反编译的,好在Android ADT为我们集成了混淆代码的工具,一来可以混淆我们的代码,让程序被反编译后基本看不懂,另外还能起到代码优化的作用.发布项目前,建议打开Android的代码混淆功能. Android ADT主要通过ProGuard工具来提供代码混淆,网上也有挺多博客文章讲这个的,但感觉很多都介绍得太过于复杂,这里我就以问答的方式来更加简洁地介绍下ProGuard吧. 1. ProGuard是什么 ProGuard是一个工具,用来

call to OpenGL ES API with no current context 和Fatal signal 11

近日在用cocos2dx3.4的时候使用了JNI调用,发现一个现象 当不使用jni的时候完全正常,使用了jni后回去的所有文字都变成黑块,并且有概率程序崩溃,附带出了两个log call to OpenGL ES API with no current context  和 Fatal signal 11 但同样的cocos2dx ,同样的jni代码,另一个项目却正常.找寻了好久之后发现了原因 cocos2dx 3.x以后版本 不再是一个进程跑到底: 引用:"Cocos2d-x从2.x版本到上周

UTF编码问题小结

在编程当中经常出现乱码的问题,而由此一般会引发很多惨剧,如读文件不成功.用户名显示乱码等,所以端午节抽了一小点时间好好看了一下编码问题,以备遗忘. 首先是中文编码,除了台湾和香港常用的BIG5,国内大概都用的是gb2312,这个可以从各大门户的首页源码中找到一些线索.还有一种叫gbk,这是微软对gb2312的拓展.主要由于gb2312只能表示6763个简体汉字,682个符号,具体可见字符区别. 然后是编程当中常见的utf编码,相信很多程序员都晕.比如我们最近在做android的NDK编程时,就发