说到动态就有静态,但是静态的注册在上一篇文章中已经包含了,这里就不在赘述了,直接说动态实现。

这里我们分步走。

1.创建android工程

选择普通工程

项目命名

不出意外,项目一会就建立完成。

2.关联NDK

打开项目配置

选择NDK安装位置

选择好了之后,点击OK即可。

这里说一下,然后如果没有配置NDK环境变量的,需要给系统配置一下环境变量,我的是mac直接运行命令行:

vim ./.bash_profile

打开后,添加

export NDK_HOME=填写你的NDK安装路径

export PATH=$PATH:$NDK_HOME

3.建立C++文件

这里我起名NdkDynamic,在java包下新建了jni包,把类放在里面,内容如下:

#include

#include "jni.h"

#define JNI_CLASS "com/simple/dynamicdemo/NdkTest" //定义native方法的java文件

/**

* 返回一个字符串

* **/

JNIEXPORT jstring JNICALL native_hello(JNIEnv *env, jclass clazz) {

return env->NewStringUTF("Hello from C++");

}

/**

* 求两个int的值

* **/

JNIEXPORT jint JNICALL native_add(JNIEnv *env, jobject object, jint a, jint b) {

return a + b;

}

/**

* 方法数组,JNINativeMethod的第一个参数是Java中的方法名,第二个参数是函数签名,第三个参数是对应的方法指针,

* java方法的签名一定要与对应的C++方法参数类型一致,否则注册方法可能失败

* **/

static JNINativeMethod method_table[] = {

{"native_hello", "()Ljava/lang/String;", (void *) native_hello},

{"native_add", "(II)I", (void *) native_add}

};

/**

* 默认会调用的方法,这里把方法注册好

**/

JNIEXPORT jint JNI_OnLoad(JavaVM *vm, void *reserved) {

//OnLoad方法是没有JNIEnv参数的,需要通过vm获取。

JNIEnv *env = NULL;

if (vm->AttachCurrentThread(&env, NULL) == JNI_OK) {

//获取对应声明native方法的Java类

jclass clazz = env->FindClass(JNI_CLASS);

if (clazz == NULL) {

return JNI_FALSE;

}

//注册方法,成功返回正确的JNIVERSION。

if (env->RegisterNatives(clazz, method_table, sizeof(method_table)/ sizeof(method_table[0]))==JNI_OK) {

return JNI_VERSION_1_4;

}

}

return JNI_FALSE;

}

这里的JNI_CLASS我们需要更改成我们待会调用这个C++的java类,根据需要更改包名,这里我们用到了method_table这个数组来注册我们的方法,一,三介绍了,下面给一下第二个参数的签名对应列表。

签名列表对应

4.建立Android.mk和配置build.gradle

我们在刚才新建的jni文件夹下,新建Android.mk文件,内容如下:

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE := JNITest

LOCAL_SRC_FILES := NdkDynamic.cpp

LOCAL_LDFLAGS += -llog

include $(BUILD_SHARED_LIBRARY)

这里的LOCAL_MODULE就是我们最后依赖文件名称,LOCAL_SRC_FILES就是我们的C++文件,然后进入app下的build.gradle,添加如下部分:

externalNativeBuild {

ndkBuild {

abiFilters "arm64-v8a", "armeabi-v7a", "x86"

}

}

以及

externalNativeBuild {

ndkBuild {

path "src/main/jni/Android.mk"

}

}

示意图如下:

gradle配置示意图

5.调用实现

返回我们的第三步,看到JNI_CLASS最后为NdkTest,那我们就新建一个NdkTest的java类,如下:

public class NdkTest {

static {

System.loadLibrary("JNITest");

}

public native String native_hello();

public native int native_add(int a,int b);

}

需要注意的是这里的JNITest和我们的Android.mk里面的LOCAL_MODULE是对应的,不要混淆了,最后我们在MainActivity中调用一下,如下:

public class MainActivity extends AppCompatActivity {

public NdkTest ndkTest;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

ndkTest = new NdkTest();

Log.d("MainActivity", ndkTest.native_add(8,9) + "");

}

}

成功打印!大功告成。

android 动态注册,Android studio实现动态注册Native方法相关推荐

  1. 【学习Android NDK开发】Java通过JNI调用native方法

    参考:Android NDK,sample/hello-jni示例项目 系统环境:Ubuntu 12.04 LTS 32-bit 1.准备工作 打开Eclipse,新建Android项目: Appli ...

  2. 【Android NDK 开发】Android.mk 配置动态库 ( Android Studio 配置动态库 | 动态库加载版本限制 | 本章仅做参考推荐使用 CMake 配置动态库 )

    文章目录 I . Android Studio 中使用 Android.mk 配置动态库 总结 II . 第三方动态库来源 III . 配置 Android.mk 构建脚本路径 IV . 预编译 第三 ...

  3. android 函数名注册,Android JNI 函数注册的两种方式(静态注册/动态注册)

    在Android开发中,由于种种原因我们需要调用C/C++代码, 这个时候就要用到Android开发者都听说过的JNI(Java Native Interface)了, 在调用JNI相关方法之前, 要 ...

  4. android的动态注册,Android JNI 函数注册的两种方式(静态注册/动态注册)

    JNI/NDK 在Android开发中,由于种种原因我们需要调用C/C++代码, 这个时候就要用到Android开发者都听说过的JNI(Java Native Interface)了, 在调用JNI相 ...

  5. android的动态注册,Android应用开发之BroadcastReceiver(广播)的静态注册和动态注册 --Android开发...

    本文将带你了解Android应用开发之BroadcastReceiver(广播)的静态注册和动态注册 --Android开发,希望本文对大家学Android有所帮助 BroadcastReceiver ...

  6. Android NDK之静态/动态注册Native方法

    一.简介 关于NDK有两种方法注册:静态注册和动态注册. 静态注册: 就是直接在Java文件里写个native方法 然后再c/c++文件中实现这个方法就行了: 动态注册: 就是为了不要写很长的方法名, ...

  7. 【Android NDK 开发】Android Studio 使用 CMake 导入动态库 ( 构建脚本路径配置 | 指定动态库查找路径 | 链接动态库 )

    文章目录 I . CMake 引入动态库与静态库区别 II . Android Studio 中 CMake 引入动态库流程 III . 指定动态库查找路径 IV . 链接函数库 V . 完整代码示例 ...

  8. 【Android NDK 开发】NDK 交叉编译 ( Ubuntu 中交叉编译动态库 | Android Studio 中配置使用第三方动态库 )

    文章目录 I . 动态库 与 静态库 II . 编译动态库 III. Android Studio 使用第三方动态库 IV . Android Studio 关键代码 V . 博客资源 I . 动态库 ...

  9. Android studio—SQlite数据库注册登录

    Android studio-SQlite数据库注册登录 文章目录 Android studio-SQlite数据库注册登录 创建用户类 创建数据库 注册写入数据库 登录读取数据库 效果展示 布局文件 ...

最新文章

  1. 网易云易盾荣获雷锋网颁发的年度最佳视频内容审查奖
  2. springboot过滤字段_SpringBoot自定义过滤器的两种方式及过滤器执行顺序
  3. Debian8 远程登录Permission Denied,please try again
  4. Service Intent must be explicit
  5. java 获得天气预报信息
  6. 关于第5周反向传播算法的一些争论与思考
  7. # 20155337 2016-2017-2 《Java程序设计》第十周学习总结
  8. 8个Python高效数据分析的技巧
  9. 搭建自己的企业QQ [2007年6月15日]
  10. 从零开始学习python编程-如何从零开始学python?
  11. scale缩放中心_规范化(包含归一化)、标准化、中心化、BN、正则化的区别
  12. Advanced Installer 历史版本下载
  13. 收集一些jQueryMobile的插件和案例
  14. 【Python游戏】Python实现一个推箱子小游戏 | 附带源码
  15. ECharts怎样显示中国地图
  16. 在Vmware 14 pro 中安装中兴新支点操作系统
  17. Python爬虫初学(3)登陆武汉理工大学教务处
  18. 如何去除Html中超链接默认下划线
  19. 测试网页版淘宝购物车
  20. php 插件推荐,Typecho实用插件推荐(一)

热门文章

  1. SSH登录Ubuntu速度缓慢/usr/bin/xauth: timeout in locking authority file /home/book/.Xauthority
  2. SE Class's Individual Project--12061161 赵梓皓
  3. 视频号:CTO要不要写代码?阿里员工究竟挣多少钱?
  4. bt服务器搭建 linux_用树莓派搭建BT下载服务器
  5. Redis相关命令及使用场景介绍
  6. 5G时代 ,物联网技术赋能智慧医疗
  7. 7-1 换硬币 将一笔零钱换成5分、2分和1分的硬币,要求每种硬币至少有一枚,有几种不同的换法?
  8. GBase 8c PGXC_CLASS系统表
  9. 电脑爱好者计算机杂志,电脑爱好者杂志
  10. ZJOI2008 泡泡堂