Android使用jni调用c++/c方法详解

Android使用Jni调用C++/C方法详解

什么是JNI?

JNI全称Java Native Interface,就是Java本地接口,它可以让Java程序调用其他语言编写的动态库,比如C++、C语言等。

Jni调用C++/C方法步骤

  1. 准备好动态库。在使用Jni调用C++/C方法之前,首先需要编写好被调用的C++/C代码,并将其编译成动态库。在编译完成后,需要将其添加到Android工程中。
  2. 编写Java类。在Java类中声明一个native方法,并在static代码块中使用System.loadLibrary加载编译好的动态库。
  3. 使用javah生成对应的头文件。在工程的src/main/java目录中执行命令:javah <包名>.<类名>。例如:
javah com.example.myapp.MainActivity
  1. 在刚刚生成的头文件中,实现刚刚在Java类中声明的native方法。这里就可以使用C++/C代码实现功能。
  2. 将C++/C代码编译成动态库,将其添加到Android工程中。
  3. 在Java类中调用native方法即可完成Jni调用C++/C方法操作。

示例说明

以下是两个例子来具体说明Jni调用C++/C方法的过程。

示例一:返回一个int

C++代码实现

#include<iostream>
#include<cstring>

extern "C" {
    int add(int a, int b);  //声明,表明该方法供其他代码调用
}

int add(int a, int b) {
    return a + b;
}

配置CMake

//生成一个共享库 libadd-lib
add_library(
        add-lib
        SHARED
        add.cpp)

target_link_libraries(
        add-lib
        android
        log)

Java代码实现

MainActivity.java:

package com.example.jni;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity {

    //本地方法,实现具体的加法运算
    public native int add(int a, int b);

    //初始化动态库
    static {
        System.loadLibrary("add-lib");
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        int result = add(1, 2);
        ((TextView)findViewById(R.id.sample_text)).setText("1+2=" + result);
    }
}

示例二:返回一个字符串

C++代码实现

#include<iostream>
#include<cstring>

extern "C" {
    char * greet(const char * name);    //声明,表明该方法供其他代码调用
}

char * greet(const char * name) 
{   
    char * greeting = new char[30];
    if (greeting == nullptr) {
        return nullptr;
    }
    strcpy(greeting, "Hello ");
    strcat(greeting, name);
    return greeting;
}

配置CMake

//生成一个共享库 libgreet-lib
add_library(
        greet-lib
        SHARED
        greet.cpp)

target_link_libraries(
        greet-lib
        android
        log)

Java代码实现

MainActivity.java:

package com.example.jni;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity {

    //本地方法,实现具体的加法运算
    public native String greet(String name);

    //初始化动态库
    static {
        System.loadLibrary("greet-lib");
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        String result = greet("Linus");
        ((TextView)findViewById(R.id.sample_text)).setText(result);
    }
}

以上就是Jni调用C++/C方法的步骤和示例说明。如果有其他问题,欢迎在评论区留言。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Android使用jni调用c++/c方法详解 - Python技术站

(0)
上一篇 2023年5月23日
下一篇 2023年5月23日

相关文章

  • Windows10系统遇到”不能打开要写入的文件”怎么办

    下面是关于“Windows10系统遇到’不能打开要写入的文件’怎么办”的完整攻略,分为以下几个步骤: 1. 检查文件权限 首先,我们需要确认文件是否有正确的权限限制。当一个文件受限时,您可能无法访问它,甚至将其写入到其中。 如何检查文件权限 单击鼠标右键并选择 “属性” 选项 选择 “安全” 标签页并检查是否与您的用户帐户相关联。 如果您有权限,请在相应的区…

    C 2023年5月23日
    00
  • c++中.dll与.lib文件的生成与使用的详解

    C++中.dll与.lib文件的生成与使用的详解 在Windows系统下,动态链接库(DLL)和静态库(LIB)是常用的代码重用手段。在C++中,我们可以通过Visual Studio来生成这两种库文件。 一、生成DLL文件 DLL(Dynamic-link Library)可以在程序运行时动态加载,它可以实现代码共享和隔离。下面是生成DLL文件的步骤: 在…

    C 2023年5月23日
    00
  • oracle 数据库隔离级别学习

    Oracle 数据库隔离级别学习 简介 数据库隔离级别是指在多个并发事务之间的数据隔离程度。Oracle 数据库中提供了四种不同隔离级别(未提交读取、已提交读取、可重复读取、串行化),每种级别各自具有不同的数据隔离程度和并发性能。这篇文章将为您详细介绍这四种隔离级别以及如何选择适合您的数据库场景的级别。 隔离级别 未提交读取 未提交读取是最低级别的隔离级别,…

    C 2023年5月23日
    00
  • 介绍一个针对C++程序的MySQL访问库soci

    介绍一个针对C++程序的MySQL访问库soci soci是一个跨平台的C++库,提供了对多种数据库(包括MySQL)访问的支持。在操作数据库的过程中使用soci库可以大大提高程序的开发效率,减少代码量。 soci的安装和使用过程如下: 一、安装soci库 安装依赖库 soci库依赖于一些库,需要先安装这些库: sudo apt-get install li…

    C 2023年5月22日
    00
  • C++ 动态内存分配详解(new/new[]和delete/delete[])

    C++ 动态内存分配详解(new/new[]和delete/delete[]) 动态内存分配是指程序在运行期间根据需要动态地申请内存空间的过程,C++语言提供了new/new[]和delete/delete[]运算符来进行动态内存分配和释放。 动态内存分配方式 new关键字动态分配单变量内存 语法格式: new dataType; 对于上述语句,程序在运行期…

    C 2023年5月23日
    00
  • java 异常之手动抛出与自动抛出的实例讲解

    Java 异常之手动抛出与自动抛出的实例讲解 在 Java 语言中,异常是一个重要的特性,用于处理运行时的错误或异常情况。Java 异常是一个对象,表示在程序执行期间发生的异常情况。在 Java 中,异常通常分为检查异常和非检查异常两种。 异常类型 检查异常:是指在编写程序时必须进行捕获或者在方法中进行抛出声明的异常,例如 IOException、Inter…

    C 2023年5月23日
    00
  • c_str()的用法详细解析

    c_str()的用法详细解析 简介 c_str() 是C++中的字符串处理函数,用于将C++的字符串对象转换为C语言的字符串(也称为字符数组)。 在C++的标准库中,字符串类型有多种,其中比较常见的有 std::string。而在一些需要使用C语言字符串(字符数组)的场合,需要使用c_str()函数将字符串对象转换成字符数组。 语法 const char* …

    C 2023年5月22日
    00
  • OpenMP深入剖析reduction子句教程

    《OpenMP深入剖析reduction子句教程》是一篇介绍OpenMP并行编程中的reduction子句的文章,在这篇文章中,笔者为大家详细讲解了reduction子句的常用用法、编写注意事项、性能优化技巧等。 下面是详细的攻略: 标题 OpenMP深入剖析reduction子句教程 介绍 OpenMP是一套并行编程API,用于编写多线程程序。其中的red…

    C 2023年5月23日
    00
合作推广
合作推广
分享本页
返回顶部