Android NDK编程(三)--- Android调用C的函数

本文介绍如何通过JNI在Android中调用C/C++函数,包括布局文件的修改、按钮事件处理以及如何实现带参数的JNI方法。通过实例演示了如何在Java中调用C/C++代码,并展示了一个简单的字符串拼接示例。
摘要由CSDN通过智能技术生成

前言

前两章简单介绍了NDK的基本情况,今天我们这一篇来做做怎么通过JNI来调用C/C++的函数。

代码演示

我们还是用第一章里面创建的vaccaendk的Demo,首先我们先修改一下布局文件,在里面加上一个按钮

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">


    <TextView
        android:id="@+id/sample_text"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello World!"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent" />


    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="测试按钮"
        android:id="@+id/btncs"
        android:onClick="btnclick"/>
</android.support.constraint.ConstraintLayout>

按钮里面加上了onCLick的事件名称为btnclick,我们通过Alt+Enter选择在对应的Activity中创建这个按钮事件。

MainActivity.java

我们回到MainActivity中,其中原来默认的stringFromJni方法就是直接返回了一个字符串,到时候我们看一下源码即可。

接下来我们来试一下带参数的方法怎么实现。

我们新建了一个settextgood的方法,里面有一个输入参数,和一个返回参数。

可以看到,刚定义完的方法显示为红色字体,接下来我们鼠标放到方法名上,然后按ALT+ENTER,选择下方红框中的第一项

程序会自动跳转到native-lib.cpp的文件夹中创建了对应的调用方法

接下来我们编写这个settextgood的方法



extern "C"
JNIEXPORT jstring JNICALL
Java_dem_vac_vaccaendk_MainActivity_settextgood(JNIEnv *env, jobject instance, jstring str_) {
    const char *str = env->GetStringUTFChars(str_, 0);


    //定义追加的字符
    char * addstr=",我是追加的字符";
    //定义要输出的字符并设置长度
    char * outputstr = new char[strlen(str)+strlen(addstr)];
    //开始组装输出的字符
    //1.传入的字符拷贝进来
    strcpy(outputstr,str);
    //2.连接刚刚定义的追加字符
    strcat(outputstr,addstr);


    //释放资源
    env->ReleaseStringUTFChars(str_, str);


    return env->NewStringUTF(outputstr);
}

最后我们再重新写了一按钮事件,点击进传入一个“Hello”进去。

我们运行一下程序看看

刚进来时显示Hello from C++,我们现在再点击一下测试按钮后看看结果

-END-

Vaccae的往期经典


OpenCV

《C++ OpenCV案例实战---卡号获取

《C++ OpenCV案例实战---卡片截取(附代码)

《C++ OpenCV透视变换---切换手机正面图片》

《C++ OpenCV实战---获取数量

《C++ OpenCV实战---利用颜色分割获取数量》


Android

《Android利用SurfaceView结合科大讯飞修改语音实别UI

《Android关于语音识别的功能实现分析(一)---结构化思维》

《Android关于语音识别的功能实现分析(二)---语义解析》

《Android根据类生成签名字符串

《Android碎片化布局fragment的实战应用


.Net C#

《C#自定义特性(Attribute)讲解与实际应用

《C#根据类生成签名字符串(附DEMO下载地址)

《C++创建动态库C#调用》

《C#与三菱PLC(型号FX2N)串口通讯类


数据库及其它

《Oracel存储过程写报表实战》

《Delphi轮播视频和图片程序(用于双屏显示程序)

《SQL随机增加销售数据的脚本编写(附脚本下载地址)


长按下方二维码关注微卡智享

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Vaccae

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值