安卓之JNI 和 NDK编程(四)java调用c++代码简单介绍

文章目录

1、前言

1.1 Android SDK介绍

1.2 使用纯java开发App的特点

1.3 引入NDK

2、环境搭建(简单说明,不做深入介绍)

2.1搭建Android开发环境

  2.1.1安装JDK

  2.1.2 安装Android Studio和SDK

2.2 Android NDK环境搭建

3、java调用c++代码

3.1 ndk项目搭建

3.2 java调用c++代码简单介绍

***java与c++方法映射关系1

***java与c++方法映射关系2


1、前言

1.1 Android SDK介绍

Android是基于Linux内核的一个手机操作系统,谷歌提供了开发包(Android SDK),程序员可以通过开发包开发Android APP(应用程序)。Android SDK提供java语言接口,因此Android应用是使用java开发的

1.2 使用纯java开发App的特点

在某些场合下,使用纯Java开发Android应用程序并不完美,比如:

1>、有高性能算法,Java语言无法满足

2>、有跨平台需求,希望将app移植到ios

3>、已有代码的重用

1.3 引入NDK

早在Android 1.6(2009年)时,google就提供了NDk(native development kit),NDK包括了一套Android的交叉编译环境和开发库,利用它可以编写C/C++程序,并编译成Android环境下使用的动态库,Java代码通过Jni规范,调用C/C++写的动态库。

目前从Android Studio 2.2中及以上版本,集成了C/C++开发环境,开发人员在使用C/C++更加简单了。

 

2、环境搭建(简单说明,不做深入介绍)

2.1搭建Android开发环境

  2.1.1安装JDK

  2.1.2 安装Android Studio和SDK

2.2 Android NDK环境搭建

1>下载NDK开发包

2>解压缩Android NDK

3>将NDK解压到随意目录(但是目录不能包含中文和空格)。

4>配置NDK路径

5>查看是否配置Android NDK,如下说明已经配置好

3、java调用c++代码

3.1 ndk项目搭建

默认工具链、C++11、C++14,我这里选的C++11,

生成的项目工程,cpp文件里面是C++代码,java文件里面是java代码

3.2 java调用c++代码简单介绍

MainActivity

package com.luminal.ndktest;

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

public class MainActivity extends AppCompatActivity {

    // Used to load the 'native-lib' library on application startup.
    static {
        System.loadLibrary("native-lib");
    }

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

        // Example of a call to a native method
        TextView tv = (TextView) findViewById(R.id.sample_text);
        tv.setText(stringFromJNI());
    }

    /**
     * A native method that is implemented by the 'native-lib' native library,
     * which is packaged with this application.
     */
    public native String stringFromJNI();
    
}

***java与c++方法映射关系1

stringFromJNI方法没有实现。它不像普通的 java方法,如onCreate方法 有大括号、方法体。

stringFromJNI没有方法体,那么它的方法体在哪里呢?在c++代码,native-lib.cpp里面,

其中关键字native代表stringFromJNI方法的代码不是用 java写的,而是用本地语言写的,

这里的本地语言就是指的 c 或 c++

当java调用stringFromJNI方法的时候,我们知道java代码在java虚拟机上运行,当java

虚拟机运行到stringFromJNI方法的时候,其实它就会去寻找

Java_com_luminal_ndktest_MainActivity_stringFromJNI方法,

这个方法在在c++代码,native-lib.cpp里面

#include <jni.h>
#include <string>

extern "C" JNIEXPORT jstring JNICALL
Java_com_luminal_ndktest_MainActivity_stringFromJNI(
        JNIEnv *env,
        jobject /* this */) {
    std::string hello = "Hello from C++";
    return env->NewStringUTF(hello.c_str());
}

***java与c++方法映射关系2

Java_com_luminal_ndktest_MainActivity_stringFromJNI方法名是怎么来的呢?

Java表示是java要调用的方法

com_luminal_ndktest    Android的包名com.luminal.ndktest

MainActivity     Android的类名

stringFromJNI    Android的方法名

也就是jni规范规定了的格式当java在调用native方法的时候,它就按照上面这种格式来找

Java_com_luminal_ndktest_MainActivity_stringFromJNI方法,

所以我们运行项目如下图,出现文字是 Hello from C++

而不是布局文件activity_main里面的 Hello World!

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

被开发耽误的大厨

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

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

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

打赏作者

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

抵扣说明:

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

余额充值