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


    前提条件:

    新建一个Empty Project

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

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

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

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

    1. <?xml version="1.0" encoding="utf-8"?>
    2. <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    3. xmlns:app="http://schemas.android.com/apk/res-auto"
    4. xmlns:tools="http://schemas.android.com/tools"
    5. android:layout_width="match_parent"
    6. android:layout_height="match_parent"
    7. tools:context=".MainActivity">
    8. <TextView
    9. android:id="@+id/text_view"
    10. android:layout_width="wrap_content"
    11. android:layout_height="wrap_content"
    12. android:text="Hello World!"
    13. app:layout_constraintBottom_toBottomOf="parent"
    14. app:layout_constraintLeft_toLeftOf="parent"
    15. app:layout_constraintRight_toRightOf="parent"
    16. app:layout_constraintTop_toTopOf="parent" />
    17. </androidx.constraintlayout.widget.ConstraintLayout>

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

    1. static {
    2. System.loadLibrary("jnidemo");
    3. }

    写一个native方法

    public native String stringFromJNI();

    MainActivity.java代码整体如下:

    1. package com.example.hellojni;
    2. import androidx.appcompat.app.AppCompatActivity;
    3. import android.os.Bundle;
    4. import android.widget.TextView;
    5. public class MainActivity extends AppCompatActivity {
    6. static {
    7. System.loadLibrary("hellojni");
    8. }
    9. public native String stringFromJNI();
    10. @Override
    11. protected void onCreate(Bundle savedInstanceState) {
    12. super.onCreate(savedInstanceState);
    13. setContentView(R.layout.activity_main);
    14. TextView textView = findViewById(R.id.text_view);
    15. textView.setText(stringFromJNI());
    16. }
    17. }

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

    1. #include <jni.h>
    2. #include <string>
    3. extern "C"
    4. JNIEXPORT jstring JNICALL
    5. Java_com_example_hellojni_MainActivity_stringFromJNI(
    6. JNIEnv* env,
    7. jobject) {
    8. std::string hello = "Hello From C++";
    9. return env->NewStringUTF(hello.c_str());
    10. }

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

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

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

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

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

    看下运行结果:

  • 相关阅读:
    学习多线程,创建多线程的三种方式
    官宣出自己的博客啦
    Fresco 图片框架简单使用
    污水处理厂3D数字孪生三维可视系统降低设备风险隐患
    016 Linux 卧槽,看懂进程信息也不难嘛?top、ps
    Java 19的未来:新特性、性能优化和更多
    交换机和路由器技术-19-HSRP和PVSTP综合实验
    高德地图脚本加载异常,浏览器报错
    P44,45 属性预处理,执行后游戏效果回调,附录指定区域内修改变量
    cookie加密解密和保证数据完整性(不被篡改)
  • 原文地址:https://blog.csdn.net/qq_41688840/article/details/134458144