JNI的使用(AndroidStudio)

一、JNI的作用:

1.使JAVA与本地其他类型语言(C、C++)交互;

2.在JAVA代码里调用C、C++等语言的代码 或 C、C++调用JAVA代码。

由于JAVA具有跨平台的特点,所以JAVA与本地代码的交互能力弱,采用JNI特性可以增强JAVA与本地代码的交互能力。

二、AndroidStudio中JNI的使用方法:

准备工作:

1. 在AndroidStudio里,点击File->Settings...,检查下图中红框圈中的两个工具有没有下载,没有的话需要进行下载:

JNI的使用(AndroidStudio)_第1张图片

2. 配置环境:

打开自己的环境配置文件.bashrc,在最后添加如下两行内容:

export ANDROID_NDK=/home/xayf/Android/Sdk/ndk/23.1.7779620
export PATH=$PATH:$ANDROID_NDK

注:加粗、标红部分是NDK在自己系统里安装的位置。

执行source ~/.bashrc,编译环境。

操作方法:

1. 新建一个工程JNITest,在工程的包名下,新建一个JAVA类,类名为JNITest:

package com.example.jnitest;

public class JNITest {
    public native String getJNIString();
}

2. 使用javac命令编译JNITest.java文件,生成JNITest.class文件。

在工程目录下~/AndroidStudioProjects/JNITest执行如下命令:javac app/src/main/java/com/example/jnitest/JNITest.java

执行完毕后可以看到包名下面生成了对应的class文件,如下图所示:

JNI的使用(AndroidStudio)_第2张图片

 3. 生成JNITest.class文件后,需要生成对应的.h文件:

在工程目录下~/AndroidStudioProjects/JNITest执行如下命令:javah -d app/src/main/jni -classpath app/src/main/java/ -jni -v com.example.jnitest.JNITest

执行完毕后可以看到在app/src/main目录下生成了jni目录,目录里生成了对应的.h文件,文件名为com_example_jnitest_JNITest.h

4. 在jni目录下,新建一个cpp文件,命名为JNITest.cpp,文件里实现JNITest.java文件里定义的本地方法:

右击jni->New->C/C++ Source File->输入JNITest

//
// Created by xayf on 2021/11/4.
//

#include 
#include 
#include 

#ifndef _Included_com_example_jnitest_JNITest
#define _Included_com_example_jnitest_JNITest
#ifdef __cplusplus
extern "C" {
#endif

JNIEXPORT jstring JNICALL Java_com_example_jnitest_JNITest_getJNIString
(JNIEnv* env, jobject obj)
{
     return env->NewStringUTF("Hello From JNITest Function(getJNIString)");
};
#ifdef __cplusplus
}
#endif
#endif

5. 在jni目录下,再新建一个Android.mk文件:

右击jni目录->New->File->输入Android.mk,在文件里写入如下配置:

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := JNITest
LOCAL_SRC_FILES := \
JNITest.cpp \
include $(BUILD_SHARED_LIBRARY)

6. 在终端进入到"~/AndroidStudioProjects/JNITest/app/src/main/jni"目录下,执行ndk-build,执行后在app/src/main目录下自动生成lib文件夹,生成好的so库文件就在lib文件夹下,如下图所示:

JNI的使用(AndroidStudio)_第3张图片

 7. 建立so库与JAVA文件的关系,在工程的MainActivity活动对应的布局文件activity_main里,添加一个TextView控件:

 在MainActivity活动里,添加代码,文件内容如下:

package com.example.jnitest;

import androidx.appcompat.app.AppCompatActivity;

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

import org.w3c.dom.Text;

public class MainActivity extends AppCompatActivity {

    static {
          System.loadLibrary("JNITest");
    }
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        TextView textView = (TextView) findViewById(R.id.textview);
        JNITest jniTest = new JNITest();
        textView.setText(jniTest.getJNIString());
    }
}

8. 关键步骤:在Android工程的build.gradle文件里,添加下面的代码:

android {
    ...
    sourceSets {
         main() {
             jniLibs.srcDirs = ['src/main/libs']
             jni.srcDirs = [] //屏蔽掉默认的jni编译生成过程

         }
    }
}

9. 运行工程到手机,显示画面如下:

JNI的使用(AndroidStudio)_第4张图片

图中显示的文字即为cpp文件里定义的方法返回的字符串值。

你可能感兴趣的:(Android,java)