使用RegisterNatives注册原生代码
来源:互联网 发布:电脑炒股软件 知乎 编辑:程序博客网 时间:2024/04/27 16:38
在Android开发本地代码时,有两种方式,一种是使用javah生成头文件,然后编辑源代码,另一种不用生成头文件,直接编辑代码后,使用RegisterNatives方法进行注册,下面是一个Demo:
Java代码:
package com.example.jnitest;public class TestJni {static {System.loadLibrary("Hello");}// static methodpublic static native String test();// member methodpublic native String test2();}
这里定义了两个native方法,test是静态方法,test2是成员方法。
使用C++实现两个方法:
static jstring test(JNIEnv *env, jclass clz){LOGD("Hello1");return env->NewStringUTF("Hello1");}static jstring test2(JNIEnv *env, jobject obj){LOGD("Hello2");return env->NewStringUTF("Hello2");}
实现了之后,需要注册两个方法
第一步:定义数据结构:
// register methods:static JNINativeMethod methods[] = {{"test", "()Ljava/lang/String;", (void*) &test},{"test2", "()Ljava/lang/String;", (void*) &test2}};
第二步:在JNI_OnLoad方法中,对方法进行注册:
int jniRegisterNativeMethods(JNIEnv* env, const char* className, const JNINativeMethod* gMethods, int numMethods){ jclass clazz; int tmp; LOGD("Registering %s natives\n", className); clazz = env->FindClass(className); if (clazz == NULL) { LOGD("Native registration unable to find class '%s'\n", className); return -1; } if ((tmp=env->RegisterNatives(clazz, gMethods, numMethods)) < 0) { LOGD("RegisterNatives failed for '%s', %d\n", className, tmp); return -1; } return 0;}int registerNativeMethods(JNIEnv *env) {return jniRegisterNativeMethods(env, "com/example/jnitest/TestJni", methods, sizeof(methods) / sizeof(methods[0]));}JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM* vm, void* reserved) { JNIEnv* env = NULL; jint result = JNI_ERR; if (vm->GetEnv((void**) &env, JNI_VERSION_1_4) != JNI_OK) { return result; } if (registerNativeMethods(env) != JNI_OK) { return -1; } result = JNI_VERSION_1_4;LOGD("jni load start: %d", result);return result;}
Android.mk:
LOCAL_PATH := $(call my-dir)include $(CLEAR_VARS)LOCAL_CFLAGS := -D__STDC_CONSTANT_MACROSLOCAL_LDLIBS += -lc -lm -llog LOCAL_SHARED_LIBRARIES += liblog libcutils libnativehelperLOCAL_MODULE := HelloLOCAL_SRC_FILES := com_example_jnitest_TestJni.cppinclude $(BUILD_SHARED_LIBRARY)
2 0
- 使用RegisterNatives注册原生代码
- android开发--- jni使用RegisterNatives注册本地方法
- RegisterNatives注册失败,返回错误码-1
- android-jni RegisterNatives注册本地方法
- JNI方法的静态注册和动态注册RegisterNatives
- JNI:使用RegisterNatives方法传递和使用Java自定义类
- JNI:使用RegisterNatives方法传递和使用Java自定义类
- JNI:使用RegisterNatives方法传递和使用Java自定义类
- JNI:使用RegisterNatives方法传递和使用Java自定义类
- JNI:使用RegisterNatives方法传递和使用Java自定义类
- JNI:使用RegisterNatives方法传递和使用Java自定义类
- 使用JNA,让java调用原生代码
- 使用vs2010查看android原生代码
- 原生登录+注册
- 如何使用JavaScript调用android原生代码,android原生代码调用JavaScript
- VB 使用未注册的ActiveX 代码
- smarty 注册对象 并使用 实例代码
- 原生js用户注册界面
- Android中proguard混淆第三方jar包
- sql读写图片时Image.FromStream方法提示参数错误问题解决
- 一切都只因为我太多情,才会不舍渐忘那些发霉的旧事
- freemarker获取系统信息,如操作系统信息,jvm版本信息等,tomcat的版本信息等
- LINUX Command: chown & chmod
- 使用RegisterNatives注册原生代码
- 【玩转微信公众平台之十】 图文消息回复讲解
- XML 实现 TextView的跑马灯效果
- android菜瓜笔记之手机照片选取与拍摄
- Boost[0]:环境搭建
- 给ASP增加绘图功能
- [Network]无线网络
- Android sp,wp,RefBase浅析
- 函数整理(变量和转换函数)