栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

JNI的使用(AndroidStudio)

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

JNI的使用(AndroidStudio)

一、JNI的作用:

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

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

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

二、AndroidStudio中JNI的使用方法:

准备工作:

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

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文件,如下图所示:

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

在工程目录下~/AndroidStudioProjects/JNITest执行如下命令:javah -d app/src/main/jni -classpah 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文件夹下,如下图所示:

 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. 运行工程到手机,显示画面如下:

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

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/433592.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号