Android NDK之如何避开Java_xxx标准定义
2015-08-02 00:00
393 查看
摘要: 一般情况下,我们开发NDK需要对JNI函数做如下定义:
Java_packageName_className_funcName
有了下面的方法,你可以直接定义你的func
Java_packageName_className_funcName
有了下面的方法,你可以直接定义你的func
Java代码: public class MessageUtil { static{ System.loadLibrary("sms"); } public static native void showToast(Object context,String message); } jni代码: 文件 -- sms.h // // Created by Mrper on 2015/8/2. // #include <jni.h> #ifndef SENDER_SMS_H #define SENDER_SMS_H void showToast(JNIEnv *env,jclass clazz,jobject handler,jstring message); static jint registeNativeMethods(JNIEnv *env,const char* className,JNINativeMethod *methods,int numMethod); static jint registeNatives(JNIEnv *env); #endif //SENDER_SMS_H 文件 -- sms.cpp // // Created by Mrper on 2015/8/2. // #include "sms.h" #include <stdio.h> static JNINativeMethod nativeMethods[] = { { "showToast", "(Ljava/lang/Object;Ljava/lang/String;)V", (void*)showToast } }; void showToast(JNIEnv *env,jclass clazz,jobject handler,jstring message){ jclass cls_toast = env->FindClass("android/widget/Toast"); jmethodID mid_showToast = env->GetStaticMethodID( cls_toast, "makeText", "(Landroid/content/Context;Ljava/lang/CharSequence;I)Landroid/widget/Toast;" ); jobject obj_toast = env->CallStaticObjectMethod(cls_toast,mid_showToast,handler,message,1000); jmethodID mid_show = env->GetMethodID(cls_toast,"show","()V"); env->CallVoidMethod(obj_toast,mid_show); } static jint registeNativeMethods(JNIEnv *env,const char* className,JNINativeMethod *methods,int numMethod){ jclass clazz; clazz = env->FindClass(className); if (clazz == NULL) return JNI_FALSE; if (env->RegisterNatives(clazz,methods,numMethod) < 0){ return JNI_FALSE; } return JNI_TRUE; } static jint registeNatives(JNIEnv *env){ if (registeNativeMethods(env,"com/mrper/sender/MessageUtil",nativeMethods, sizeof(nativeMethods)/sizeof(nativeMethods[0]) ) != JNI_TRUE){ return JNI_FALSE; } return JNI_TRUE; } jint JNI_OnLoad(JavaVM *vm, void*reserved){ jint result = -1; JNIEnv *env; vm->GetEnv((void**)&env,JNI_VERSION_1_6); if (env == NULL){ goto fail; } if (registeNatives(env) != JNI_TRUE){ goto fail; } result = JNI_VERSION_1_6; fail: return result; }
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- Android IPC进程间通讯机制
- Android Manifest 用法
- [转载]Activity中ConfigChanges属性的用法
- Android之获取手机上的图片和视频缩略图thumbnails
- Android之使用Http协议实现文件上传功能
- Android学习笔记(二九):嵌入浏览器
- android string.xml文件中的整型和string型代替
- i-jetty环境搭配与编译
- android之定时器AlarmManager
- android wifi 无线调试
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- android 代码实现控件之间的间距
- android FragmentPagerAdapter的“标准”配置
- Android"解决"onTouch和onClick的冲突问题