0
点赞
收藏
分享

微信扫一扫

Android studio Jni使用,安卓 java native 方法调用

RockYoungTalk 2021-09-21 阅读 143

1.下载ndk设置环境变量,并设置支持jni

1.1 下载ndk 并设置环境变量
mac环境如:

export PATH=${PATH}:/Users/apple_mini/Library/Android/sdk/ndk/22.1.7171670

1.2 打开gradle.properties,添加:

android.useDeprecatedNdk=true

1.3 打开local.properties,添加:

ndk.dir=NDK的路径

2.新建java访问c层的接口类

package com.example.testapp;

public class MyJni {

    static {
        System.loadLibrary("MyJni");
    }

    public native static String getString();

}

3.生成头文件

3.1 "make-project"编译完成
3.2 打开终端,运行

//切换到对应目录(不同版本android studio 生成class文件目录不太一样 这里是4.2.1版本)
cd app/build/intermediates/javac/debug/

//执行生成头文件命令
javah com.example.testapp.MyJni

3.3 当前目录找到 com_example_testapp_MyJni.h文件

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_example_testapp_MyJni */

#ifndef _Included_com_example_testapp_MyJni
#define _Included_com_example_testapp_MyJni
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     com_example_testapp_MyJni
 * Method:    getString
 * Signature: ()Ljava/lang/String;
 */
JNIEXPORT jstring JNICALL Java_com_example_testapp_MyJni_getString
  (JNIEnv *, jclass);

#ifdef __cplusplus
}
#endif
#endif

4.app/src/main 目录下创建jni目录 并把com_example_testapp_MyJni.h 文件拷贝进来

4.1创建MyJni.c文件,(主要把头文件引入)

#include<jni.h>
#include<stdio.h>
//导入我们创建的头文件
#include "com_example_testapp_MyJni.h"

JNIEXPORT jstring JNICALL Java_com_example_testapp_MyJni_getString(JNIEnv *env, jclass){
  //返回一个字符串
  return (*env)->NewStringUTF(env,"This is my first NDK Application");
}

4.2 创建 Android.mk文件

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)

#生成的模块名
LOCAL_MODULE := MyJni
#需要编译的c文件(可以是多个)
LOCAL_SRC_FILES := MyJni.c

include $(BUILD_SHARED_LIBRARY)

4.3 创建 Application.mk 文件 指定需要编译so库的cpu架构

APP_ABI := all

5.开始编译so文件

cd 到 app/src/main/jni 目录并执行 ndk-build命令即可在 app/src/main/libs目录 生成so文件

cd app/src/main/jni

//执行
ndk-build

6.使用so文件

6.1 把对应cpu架构文件夹和及so文件,复制到 app/libs目录
6.2 build.gradle文件 android-》defaultConfig 里面添加支持cpu架构如下:

ndk {
            abiFilters 'armeabi-v7a','x86'
     }

6.3 build.gradle文件 android层级 里面添加app/libs读取so文件 如下:

 sourceSets {
        main {
            jniLibs.srcDirs = ['libs']
        }
    }
    repositories {
        flatDir {
            dirs 'libs'
        }
    }

7 调用本地方法即可

//调用native本地方法
System.out.println("jni_str:" + MyJni.getString());

//输出结果
2021-08-05 14:49:14.358 11709-11793/com.example.testapp I/System.out: jni_str:This is my first NDK Application

举报

相关推荐

0 条评论