1. 以前在jni中写本地方法时,都会写成 Java_com_example_hellojni_HelloJni_stringFromJNI的形式,函数名很长,而且当类名变了的时候,函数名必须一个一个的改,麻烦。
现在好了有了RegisterNatives,现在一片顶过去五片,蓝瓶的好喝的!
2. hello-jni.c中
#include <string.h>
#include <jni.h>
#include <android/log.h>
#define TAG "HELLO"
#define LOGV(...) __android_log_print(ANDROID_LOG_VERBOSE, TAG, __VA_ARGS__)
#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG , TAG, __VA_ARGS__)
#define LOGI(...) __android_log_print(ANDROID_LOG_INFO , TAG, __VA_ARGS__)
#define LOGW(...) __android_log_print(ANDROID_LOG_WARN , TAG, __VA_ARGS__)
#define LOGE(...) __android_log_print(ANDROID_LOG_ERROR , TAG, __VA_ARGS__)
# define NELEM(x) ((int) (sizeof(x) / sizeof((x)[0])))
jstring native_stringFromJNI( JNIEnv* env, jobject thiz )
{
return (*env)->NewStringUTF(env, "Hello from JNI !");
}
static const char *classPathName = "com/example/hellojni/HelloJni";
static JNINativeMethod methods[] = {
{"stringFromJNI", "()Ljava/lang/String;", (void*)native_stringFromJNI},
};
jint JNI_OnLoad(JavaVM* vm, void* reserved)
{
JNIEnv* env = NULL;
jclass clazz;
//获取JNI环境对象
if ((*vm)->GetEnv(vm, (void**) &env, JNI_VERSION_1_4) != JNI_OK) {
LOGE("ERROR: GetEnv failed\n");
return JNI_ERR;
}
//注册本地方法.Load 目标类
clazz = (*env)->FindClass(env,classPathName);
if (clazz == NULL)
{
LOGE("Native registration unable to find class '%s'", classPathName);
return JNI_ERR;
}
//注册本地native方法
if((*env)->RegisterNatives(env, clazz, methods, NELEM(methods)) < 0)
{
LOGE("ERROR: MediaPlayer native registration failed\n");
return JNI_ERR;
}
/* success -- return valid version number */
return JNI_VERSION_1_4;
}
a. System.loadLibrary("hello-jni"); 时会调用 JNI_OnLoad
b. RegisterNatives的第二个参数clazz包含了类的路径
c. 定义JNINativeMethod时,第二个参数
()中的字符表示参数,后面表示返回值,
"()V"----> void func()
"(II)V"----> void func(int, int)
分享到:
相关推荐
08_12_JNI_02_jni数据类型&属性方法08_12_JNI_02_jni数据类型&属性方法08_12_JNI_02_jni数据类型&属性方法08_12_JNI_02_jni数据类型&属性方法08_12_JNI_02_jni数据类型&属性方法08_12_JNI_02_jni数据类型&属性方法08...
jni本地函数注册,c 和 c++ 两种注册方法,稍有不同。需要注意
使用动态注册的方法写一个最简单的hello-jni程序
本文档主要讲述的是Java本地调用JNI使用规范详解;JNI概述;JavaNative Interface的缩写,中文为Java本地调用。从Java1.1开始,JNI即成为Java标准的一部分。 JNI设计的目的是为了允许Java代码与其他语言进行交互。但...
android下JNI使用方法.JNI入门教程等网络资源合集
什么是jni本地方法!java里定义的其他语音实现的方法!
JNI静态注册与动态注册实例代码详细介绍。JNI静态注册与动态注册实例代码详细介绍。JNI静态注册与动态注册实例代码详细介绍。JNI静态注册与动态注册实例代码详细介绍。JNI静态注册与动态注册实例代码详细介绍。JNI...
绝对值,不值我送分给你 JNI API 本地接口JNI API 本地接口JNI API 本地接口JNI API 本地接口
JNI 函数动态注册 JNIDynamicLoad
这是Android中JNI开发中动态注册多个类的native方法,以及分模块化管理不同native的代码.
JNI动态注册 。
08_15_JNI_03_方法访问_数组处理&jni引用08_15_JNI_03_方法访问_数组处理&jni引用08_15_JNI_03_方法访问_数组处理&jni引用08_15_JNI_03_方法访问_数组处理&jni引用08_15_JNI_03_方法访问_数组处理&jni引用08_15_JNI_...
java使用JNI调用c++代码的实例,主要实现了在java环境中利用c++下的写文件流操作写一个本地文件,可以作为JNI基本配置上手的参考。
android jni使用方法有图有文字
Android JNI Android JNI 用C函数写本地库读写文件,底层调用小例子用C函数写本地库读写文件,底层调用小例子
【Android NDK 开发】JNI 动态注册 ( 动态注册流程 | JNI_OnLoad 方法 | JNINativeMethod 结构体 | GetEnv | RegisterNatives ) 博客地址 : https://hanshuliang.blog.csdn.net/article/details/104222271 I ....
android jni方法动态注册。。。C++的
jni代码例子
AIDL和JNI使用的小例子,文件为eclipse下的源码,配合我的博客可以查看如何使用aidl和jni
JNI调用本地C语言 JNI调用本地C语言 JNI调用本地C语言 JNI调用本地C语言