最近在做OpenCV4Android开发的时候,需要从摄像头捕获多个图片,传值给本地对象,每次捕获到图片都更新数据,最后将计算得到的数据传给JAVA层,并在界面中显示。经过摸索和调试后,找到了通过本地对象的地址,来实现JAVA和本地类交互的方法。

  下面,通过一个小例子进行示例说明,本例子完成通过点击按钮控件,实现本地对象的成员数据自加,并显示的功能:

首先这是我们C++类的代码,能实现自加很简单的类,能完成测试就好:

  1. class TestNDK{
  2. private:
  3. int num;
  4. public:
  5. TestNDK():num(){
  6. }
  7. void numAddSelf(){
  8. num++;
  9. }
  10. int getNum(){
  11. return num;
  12. }
  13. };

然后再写一个JAVA类,通过这个类,加载动态链接库和本地函数,还有与本地方法交互的方法,更利于管理:

  1. package com.pplxlee.testndk;
  2.  
  3. public class TestNDKClass {
  4. // 加载动态链接库
  5. static {
  6. System.loadLibrary("TestNDK");
  7. }
  8.  
  9. // 本地对象的地址,以long的形式保存
  10. private long mAddr;
  11.  
  12. // 构造函数调用本地类的创建函数
  13. TestNDKClass(){
  14. mAddr = nativeCreateObj();
  15. }
  16.  
  17. public void release(){
  18. nativeRelease(mAddr);
  19. }
  20.  
  21. public int getNum(){
  22. return nativeGetNum(mAddr);
  23. }
  24.  
  25. public void numAddSelf(){
  26. nativeNumAddSelf(mAddr);
  27. }
  28.  
  29. private static native long nativeCreateObj();
  30.  
  31. private static native void nativeRelease(long objAddr);
  32.  
  33. private static native int nativeGetNum(long objAddr);
  34.  
  35. private static native void nativeNumAddSelf(long objAddr);
  36.  
  37. }

下面是实现jni本地方法的代码:

  1. #include <jni.h>
  2.  
  3. extern "C"{
  4.  
  5. // 构造本地对象,一定要用new关键字构造,否则,方法结束后,对象会被垃圾回收,之后通过地址访问,只会得到随机的“垃圾”
  6. JNIEXPORT jlong JNICALL Java_com_pplxlee_testndk_TestNDKClass_nativeCreateObj(
  7. JNIEnv *, jclass){
  8. TestNDK* ndkObjectAddr = new TestNDK();
  9. return ((long)ndkObjectAddr);
  10. }
  11.  
  12. // 有new就必须有delete,最后不要忘记在本地对象不再需要时,释放其内存
  13. JNIEXPORT void JNICALL Java_com_pplxlee_testndk_TestNDKClass_nativeRelease(
  14. JNIEnv *, jclass, long addrNdkObject){
  15. TestNDK* ndkObjectAddr = (TestNDK*)addrNdkObject;
  16. delete ndkObjectAddr;
  17. }
  18.  
  19. JNIEXPORT jint JNICALL Java_com_pplxlee_testndk_TestNDKClass_nativeGetNum(
  20. JNIEnv *, jclass, long addrNdkObject){
  21. TestNDK* ndkObjectAddr = (TestNDK*)addrNdkObject;
  22. return (ndkObjectAddr->getNum());
  23. }
  24.  
  25. JNIEXPORT void JNICALL Java_com_pplxlee_testndk_TestNDKClass_nativeNumAddSelf(
  26. JNIEnv *, jclass, long addrNdkObject){
  27. TestNDK& ndkObject = *(TestNDK*)addrNdkObject;
  28. ndkObject.numAddSelf();
  29. }
  30.  
  31. }

下面就是我们的MainActivity

  1. public class MainActivity extends Activity {
  2.  
  3. TestNDKClass mObj;
  4.  
  5. TextView tv;
  6.  
  7. @Override
  8. protected void onCreate(Bundle savedInstanceState) {
  9. super.onCreate(savedInstanceState);
  10. setContentView(R.layout.activity_main);
  11.  
  12. mObj = new TestNDKClass();
  13.  
  14. tv = (TextView)findViewById(R.id.textView1);
  15. tv.setText(String.valueOf(mObj.getNum()));
  16.  
  17. Button btn = (Button)findViewById(R.id.button1);
  18. btn.setOnClickListener(new OnClickListener() {
  19.  
  20. @Override
  21. public void onClick(View v) {
  22. // TODO Auto-generated method stub
  23. mObj.numAddSelf();
  24. tv.setText(String.valueOf(mObj.getNum()));
  25. }
  26. });
  27.  
  28. }
  29.  
  30. @Override
  31. protected void onDestroy(){
  32. super.onDestroy();
  33. mObj.release();
  34. }
  35.  
  36. }

运行结果如下图所示,每次点击按钮,数字都会+1:

建立JNI层的本地对象,并与JAVA层交互方法的更多相关文章

  1. cocos2d-x 通过JNI实现c/c++和Android的java层函数互调

    文章摘要: 本文主要实现两个功能: (1)通过Android sdk的API得到应用程序的包名(PackageName),然后传递给c++层函数. (2)通过c++函数调用Android的java层函 ...

  2. Java层与Jni层的数组传递(转)

    源:Java层与Jni层的数组传递 Android开发中,经常会在Java代码与Jni层之间传递数组(byte[]),一个典型的应用是Java层把需要发送给客户端的数据流传递到Jni层,由Jni层的S ...

  3. Android开发实践:Java层与Jni层的数组传递

    转载:http://www.linuxidc.com/Linux/2014-03/97561.htm Android开发中,经常会在Java代码与Jni层之间传递数组(byte[]),一个典型的应用是 ...

  4. JNI通过线程c回调java层的函数

    1.参看博客:http://www.jianshu.com/p/e576c7e1c403 Android JNI 篇 - JNI回调的三种方法(精华篇) 2.参看博客: JNI层线程回调Java函数关 ...

  5. Android-WebView与本地HTML (HTML调用-->Java的方法)

    上一篇博客 Android-WebView加载网络图片&网页 介绍了 使用WebView去加载网络上的图片与网页; 此篇博客专门介绍 Android-WebView与本地HTML (HTML调 ...

  6. (转)java 层调用Jni(Ndk) 持久化c c++ 对象

    对于Jni(Ndk) 很多人应该都有印象,Android的ndk接触到的机会相对会比较多,本例子以android平台为例,pc端的话就以简单的windows为例, 编码完用vs 或是 gcc进行编译成 ...

  7. Android JNI 由C/C++本地代码向Java层传递数据

    最近做的Android项目需要调用C代码,进行串口通信及与硬件设备通信,因此要用到JNI,其中本地代码需要向Java层返回三个参数,分别为 参数一:int型: 参数二: 通信指令,本地代码中为unsi ...

  8. 操作JNI函数以及复杂对象传递

    转自:http://blog.csdn.net/qinjuning/article/details/7607214 在掌握了JNI函数的使用和相关类型的映射后,以及知晓何利用javah工具生成对应的j ...

  9. WPF——数据绑定(二)绑定方法—绑定本地对象

    注意:本人初学WPF,文中表达或技术性问题请勿见怪,欢迎指正,谢谢 标记拓展语法:绑定到本地对象 什么是绑定到本地对象,我个人理解就是实现UI层上两个或多个控件的相互关联,一个控件的状态改变,导致另一 ...

随机推荐

  1. maven 配置: 修改默认的 .m2仓库 默认存储路径.

    maven 配置: 修改默认的 .m2仓库 默认存储路径. 一 .在系统maven里修改 1.在maven_HOME/conf/下找到配置文档 settings.xml 在文档中添加如下的配置说明 & ...

  2. 不依赖外部js es 库 实现 点击内容 切换

    <!DOCTYPE html> <html lang="zh-cmn-Hans"> <head> <meta http-equiv=&qu ...

  3. Notepad++ QuickText 插件的 HTML 配置: \Notepad++\plugins\Config\QuickText.ini

    # 缩写的注解 abbr=<abbr title=''>$</abbr> # 覆盖默认的文本方向 bdo=<bdo dir='rtl'>$</bdo> ...

  4. python数据分析之:绘图和可视化

    在数据分析领域,最出名的绘图工具就是matlib.在Python同样有类似的功能.就是matplotlib.前面几章我们都在介绍数据的生成,整理,存储.那么这一章将介绍如果图形化的呈现这些数据.来看下 ...

  5. java读取TXT文件中的数据

    将文件放在一个指定的磁盘目录下: File file = new File("指定的文件路径"); try{ BufferedReader br = new BufferedRea ...

  6. SVG圆盘时钟动画

    在线演示 本地下载

  7. <算法导论>高级数据结构--以我的角度看B树(Balanced-Tree)的建增删查

    题外话:在博客园看了几篇关于B树的博文确实很有帮助,但是也看到有一些Funny的博文- -比如拿二叉树堂(BinaryTree)而皇之写上B树的帽子. 好了题归正传,B树(Balanced-Tree) ...

  8. 多线程与Java的JMM内存模型

    共享内存模型指的就是Java内存模型(简称JMM),JMM决定一个线程对共享变量的写入时,能对另一个线程可见.从抽象的角度来看,JMM定义了线程和主内存之间的抽象关系:线程之间的共享变量存储在主内存( ...

  9. Mac安装 Storm 小结

    Strom 安装&部署 本地执行:Storm Topology是可进行本地运行的, 必须在发布前进行本地测试, 以确保代码本身业务逻辑没有问题( Windows也可执行, 但是由于权限等原因, ...

  10. android使用mina需要注意的问题

    1.第三方jar包的使用       如果在Java Build Path中使用Add External JARs这种方式,运行时会有找不到类的错误(我的上面有,如果你没出现,恭喜你),上网查了几种方 ...