android生成so文件并调用

开发工具:Android Studio

一:新建一个调用C本地方法的配置类

package ndk.example.com;

public class JNITools {
    public native int addNum(int num1, int num2);
}

二:用Javah 命令生成java文件对应的.h文件

  1. 打开terminal,cd 到项目的根目录------>cd app/src/main/java
  2. 输入javah ndk.example.com.JNITools命令 //这个位置是类的包名+类名
  3. ndk_example_com_JNITools.h文件
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class ndk_example_com_JNITools */

#ifndef _Included_ndk_example_com_JNITools
#define _Included_ndk_example_com_JNITools
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     ndk_example_com_JNITools
 * Method:    addNum
 * Signature: (II)I
 */
JNIEXPORT jint JNICALL Java_ndk_example_com_JNITools_addNum
  (JNIEnv *, jobject, jint, jint);

#ifdef __cplusplus
}
#endif
#endif

三:在项目的main目录下创建一个jni文件目录,将ndk_example_com_JNITools.h文件剪贴到jni目录下,并在jni目录下创建MyJni.c文件,将.h文件中的方法拷贝到MyJni.c中,并增加方法实现(此处都是用C编写代码)。如下图:

#include "jni.h"
#include "ndk_example_com_JNITools.h"

JNIEXPORT jint JNICALL Java_ndk_example_com_JNITools_addNum(
		JNIEnv *env, jobject obj, jint num1, jint num2) {

	return num1 + num2;
}

在jni目录创建Android.mk文件

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE    := create     #对应生成libcreate.so库
LOCAL_SRC_FILES := MyJni.c   #MyJni.c源文件的名字

include $(BUILD_SHARED_LIBRARY) #构建动态链接库

在jni目录创建Application.mk文件

APP_ABI := all

四:生成so文件

  1. cd到jni 目录
  2. 运行ndk-build命令生成 so文件,我这里用的自己下载的ndk
    官方地址:https://developer.android.google.cn/ndk/downloads/older_releases.html
//执行这个命令必须在jni目录下
//这个位置是你下载的ndk 然后运行 就可以编译成功so了 分别在main/libs和main/obj
C:/android-ndk-r21-windows-x86_64/android-ndk-r21/ndk-build

五:引用so文件

//项目的类型 是app还是lib
apply plugin: 'com.android.application'
//关于项目的配置
android {
    //
    compileSdkVersion 27
    //
    defaultConfig {
        applicationId "ndk.example.com"
        minSdkVersion 20
        targetSdkVersion 27
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
        javaCompileOptions { annotationProcessorOptions { includeCompileClasspath = true } }
        multiDexEnabled true
    }
    //
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
    //引用so库文件.多个的话以逗号分隔
    sourceSets {
        main() {
            jniLibs.srcDirs = ['libs']
            jni.srcDirs = []
        }
    }
}
//项目的依赖
dependencies {
   
}

六:创建MainActivity,调用JNITools类中的本地方法,注意先加载动态链接库

  static {
      //加载so库
      System.loadLibrary("create");
  }
  
   @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_hx);
         new JNITools().addNum(20, 100);
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值