前言
前两章简单介绍了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
Android
《Android利用SurfaceView结合科大讯飞修改语音实别UI》
《Android关于语音识别的功能实现分析(一)---结构化思维》
《Android关于语音识别的功能实现分析(二)---语义解析》
.Net C#
数据库及其它
长按下方二维码关注微卡智享