博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
建立JNI层的本地对象,并与JAVA层交互方法
阅读量:6675 次
发布时间:2019-06-25

本文共 3069 字,大约阅读时间需要 10 分钟。

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

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

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

class TestNDK{private:    int num;public:    TestNDK():num(0){    }    void numAddSelf(){        num++;    }    int getNum(){        return num;    }};

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

package com.pplxlee.testndk;public class TestNDKClass {        // 加载动态链接库    static {        System.loadLibrary("TestNDK");    }            // 本地对象的地址,以long的形式保存    private long mAddr;            // 构造函数调用本地类的创建函数    TestNDKClass(){        mAddr = nativeCreateObj();    }        public void release(){        nativeRelease(mAddr);    }        public int getNum(){        return nativeGetNum(mAddr);    }        public void numAddSelf(){        nativeNumAddSelf(mAddr);    }            private static native long nativeCreateObj();        private static native void nativeRelease(long objAddr);        private static native int nativeGetNum(long objAddr);        private static native void nativeNumAddSelf(long objAddr);        }

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

#include 
extern "C"{// 构造本地对象,一定要用new关键字构造,否则,方法结束后,对象会被垃圾回收,之后通过地址访问,只会得到随机的“垃圾”JNIEXPORT jlong JNICALL Java_com_pplxlee_testndk_TestNDKClass_nativeCreateObj( JNIEnv *, jclass){ TestNDK* ndkObjectAddr = new TestNDK(); return ((long)ndkObjectAddr);}// 有new就必须有delete,最后不要忘记在本地对象不再需要时,释放其内存JNIEXPORT void JNICALL Java_com_pplxlee_testndk_TestNDKClass_nativeRelease( JNIEnv *, jclass, long addrNdkObject){ TestNDK* ndkObjectAddr = (TestNDK*)addrNdkObject; delete ndkObjectAddr;}JNIEXPORT jint JNICALL Java_com_pplxlee_testndk_TestNDKClass_nativeGetNum( JNIEnv *, jclass, long addrNdkObject){ TestNDK* ndkObjectAddr = (TestNDK*)addrNdkObject; return (ndkObjectAddr->getNum());}JNIEXPORT void JNICALL Java_com_pplxlee_testndk_TestNDKClass_nativeNumAddSelf( JNIEnv *, jclass, long addrNdkObject){ TestNDK& ndkObject = *(TestNDK*)addrNdkObject; ndkObject.numAddSelf();}}

下面就是我们的MainActivity

public class MainActivity extends Activity {        TestNDKClass mObj;        TextView tv;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);                mObj = new TestNDKClass();                tv = (TextView)findViewById(R.id.textView1);        tv.setText(String.valueOf(mObj.getNum()));                Button btn = (Button)findViewById(R.id.button1);        btn.setOnClickListener(new OnClickListener() {                        @Override            public void onClick(View v) {                // TODO Auto-generated method stub                mObj.numAddSelf();                tv.setText(String.valueOf(mObj.getNum()));            }        });            }    @Override    protected void onDestroy(){        super.onDestroy();        mObj.release();    }    }

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

每次点击按钮,中间的数据都会+1

 

转载于:https://www.cnblogs.com/pplxlee/p/5721054.html

你可能感兴趣的文章
BootStrap入门_创建第一个例子
查看>>
DBA_实践指南系列5_Oracle Erp R12日常运维和管理(案例)
查看>>
Ubuntu下C语言连接MySQL
查看>>
.NET 中 Image 转 Icon
查看>>
因第三次月考而引起的
查看>>
数据库系统简介
查看>>
常用数据结构及复杂度
查看>>
IDEA调试方法总结及各种Step的区别
查看>>
简易图片轮播效果
查看>>
Spring Boot 数据库连接池 Druid
查看>>
NodeList对象的特点
查看>>
【转载】【原创】生命中,要有自己的一方晴天
查看>>
JQuery操作CheckBox和Radio
查看>>
快速求幂
查看>>
gulp初学
查看>>
JS设置localStorage有效期
查看>>
Ajax常用写法
查看>>
测试用例设计-WEB通用测试用例
查看>>
js中将数字和字符串相互转换的方法(转自脚本之家www.jb51.net)
查看>>
centos6.5-VMware虚拟机-双网卡绑定
查看>>