NDK的基础教程 四 动态注册
来源:互联网 发布:最短路径的算法 编辑:程序博客网 时间:2024/06/10 19:42
NDK的使用分为两种静态注册和动态注册
在静态注册的时候,我们会对目标类做javah -jni操作,生产对应的.h的头文件,在cpp文件中使用头文件中自动给我们生成好的C++方法名。
而动态注册就是将两个函数联系起来,比如我们现在希望当我们调用JNIDynamicUtils的getHelloStringFromJNI方法时调用这个native_hello函数,它不需要对应目标类生成h后缀的头文件
使用例子如下:
public class MainActivity extends ActionBarActivity { private TextView mTextView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mTextView = (TextView) findViewById(R.id.test); mTextView.setText(JNIDynamicUtils.getSumFromJNI(11,22)); }}
public class JNIDynamicUtils { public static native String getSumFromJNI(int i1, int i2); static { System.loadLibrary("myNativeLib"); }}
#include <stdio.h>#include <jni.h>#include <stdlib.h>jstring calcSum(JNIEnv *env, jclass clazz, jint i1, jint i2) { char result[50]; sprintf(result, " this is string from jni. result is %d", (i1 + i2)); return env->NewStringUTF(result);}/** * JNINativeMethod由三部分组成: * (1)Java中的函数名; * (2)函数签名,格式为(输入参数类型)返回值类型; * ()Ljava/lang/String; (II)表示需要传两个int型参数,Ljava/lang/String;表示返回String,在对象类名(包括包名,‘/’间隔)前面加L,分号结尾 * (3)native函数名 */static JNINativeMethod gMethods[] = { {"getSumFromJNI", "(II)Ljava/lang/String;", (void *)calcSum }};//System.loadLibrary过程中会自动调用JNI_OnLoad,在此进行动态注册JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM *jvm, void *reserved) { JNIEnv *env = NULL; jint result = JNI_FALSE; //获取env指针 if (jvm->GetEnv((void**) &env, JNI_VERSION_1_6) != JNI_OK) { return result; } if (env == NULL) { return result; } //获取类引用 jclass clazz = env->FindClass("io/github/yanbober/ndkapplication/JNIDynamicUtils"); if (clazz == NULL) { return result; } //注册方法 if (env->RegisterNatives(clazz, gMethods, sizeof(gMethods) / sizeof(gMethods[0])) < 0) { return result; } //成功 result = JNI_VERSION_1_6; return result;}
对于JNI_OnLoad这个函数他很特殊,它是系统规定必须这样写的,系统调用它的时机也是固定的,我们需要再这个函数里将这个函数联系起来
再见,下一次我自己设计一个比较大的例子,侧重使用C++
阅读全文
0 0
- NDK的基础教程 四 动态注册
- android NDK开发 静态/动态注册 jni
- Android Ndk开发入门(实现静态注册,动态注册)
- NDK的基础教程 三 传递数组
- NDK的基础教程 五 登录判断
- NDK的基础教程 一 最简单的NDK使用
- android jni 的编写二 (NDK 开发中动态注册Jni)
- Android NDK系列(6) — 动态注册native方法
- Android Studio下的NDK开发(四):调用动态链接库中的函数
- >>listener的动态注册
- servlet的动态注册
- 动态注册的广播
- android ndk 的另一种注册方式
- NDK的基础教程 六 so库的创建和使用
- NDK动态库的调用
- NDK动态库的调用
- NDK动态库的调用
- NDK的基础教程 二 c语言回调java语言
- CodeForces
- RxSwift 系列(九) -- 那些难以理解的概念
- 【云和恩墨】性能优化:Linux环境下合理配置大内存页(HugePage)
- spring in action 面向切面
- 数组遍历排序
- NDK的基础教程 四 动态注册
- TypeError: Expected int32, got list containing Tensors of type '_Message' instead.解决方法
- tensorflow 使用正则化
- Hyper-V 虚拟机虚拟网卡慢问题解决方案
- 多态相关(虚函数,覆盖,纯虚函数,抽象类)
- HDU 1907 John (Nim博弈 模板)
- JQuery学习笔记(One)
- 一种排序
- 关于Unity3D中使用SQLite数据库发生的几种常见错误(适用新手)