当前位置: 首页 > article >正文

Android Studio 写一个Java调用c++ 的demo

前提条件:

  • 本地已经配置好了ndk环境,如果没有配置好,建议参考macos 配置ndk环境-CSDN博客 这篇链接。

新建一个Empty Project

比如我这里的Project的名字是HelloJNI,包名是com.example.hellojni

然后在src目录下,右键选择Add C++ to Module

然后展示的目录如下所示:

在activity_main.xml里给TextView组件添加一个id,整体代码如下:

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.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/text_view"
        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" />

</androidx.constraintlayout.widget.ConstraintLayout>

然后在MainActivity.java里添加调用cpp层的代码,调用cpp的库

static {
    System.loadLibrary("jnidemo");
}

写一个native方法

public native String stringFromJNI();

MainActivity.java代码整体如下:

package com.example.hellojni;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity {

    static {
        System.loadLibrary("hellojni");
    }

    public native String stringFromJNI();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        TextView textView = findViewById(R.id.text_view);
        textView.setText(stringFromJNI());
    }
}

然后需要在jnidemo.cpp里写stringFromJNI的实现方法

#include <jni.h>
#include <string>
extern "C"
JNIEXPORT jstring  JNICALL
Java_com_example_hellojni_MainActivity_stringFromJNI(
        JNIEnv* env,
        jobject) {
    std::string hello = "Hello From C++";
    return env->NewStringUTF(hello.c_str());
}

其中cpp层这个方法的命名是Java_包名_类名_方法名

  • 包名 com.example.hellojni
  • 类名 MainActivity
  • 方法名 stringFromJNI

第八行是一个string对象,内容是“Hello From C++”,然后第九行是返回一个jni的string对象

这里的返回值就是给到了Java层的stringFromJNI的返回值。

最后MainActivity里通过展示这个string显示在视图上,表示Java层调用cpp层的成功了。

看下运行结果:


http://www.kler.cn/a/132999.html

相关文章:

  • python-文件内容操作
  • 计算机使用常用工具(持续更新)
  • OpenHarmony-1.启动流程
  • MacOS下,如何在Safari浏览器中打开或关闭页面中的图片文字翻译功能
  • IDC 报告:百度智能云 VectorDB 优势数量 TOP 1
  • 【SpringBoot】公共字段自动填充
  • springMvc中的拦截器【巩固】
  • 爱上C语言:操作符详解(下)
  • 08-黑马点评项目发布笔记和查看笔记功能的实现
  • 微软Surface/Surface pro笔记本电脑进入bios界面
  • el-table中el-popover失效问题
  • Spring中用了哪些设计模式
  • 电子学会C/C++编程等级考试2021年12月(一级)真题解析
  • Stream流常见操作
  • 微信(小程序开发): 解决播放音乐没有声音的情况 代码不报错的情况下依旧没有声音的解决方案
  • vb.net 实时监控双门双向门禁控制板源代码
  • Michael Jordan最新报告:去中心化机器学习中的契约、不确定性和激励
  • 数据分析思维与模型:相关分析法
  • AIGC: 关于ChatGPT这个智能工具带来的几点思考
  • 【AI应用】 AI语音转换
  • STM32外部中断(EXTI)与RTOS多任务处理的协同设计
  • springBoot集成websocket实时消息推送
  • <MySQL> 什么是JDBC?如何使用JDBC进行编程?
  • 系列四、JVM的内存结构【本地接口(Native Interface)】
  • leecode | 数位和相等数对的最大和
  • 美国经典人工智能教材第3版出版!