1. NativeCalc和Calc类
NativeCalc
类,使用native
关键字定义方法,声明为本地方法。
public class NativeCalc {
public native double add(double left, double right);
public native double subtract(double left, double right);
public native double multiply(double left, double right);
public native double divide(double left, double right);
}
Calc
类,System.loadLibrary(String)
加载本库库文件。
public class Calc {
static {
System.loadLibrary("calcLibs");
}
private NativeCalc mCalc;
public Calc() {
mCalc = new NativeCalc();
}
public double add(double left, double right) {
return mCalc.add(left, right);
}
public double subtract(double left, double right) {
return mCalc.subtract(left, right);
}
public double multiply(double left, double right) {
return mCalc.multiply(left, right);
}
public double divide(double left, double right) {
return mCalc.divide(left, right);
}
}
2. 生成jni中的.h文件
在【File】->【Settings…】打开配置界面,在【Tools】->【External Tools】中添加javah
配置,可以方便地生成.h
文件。
配置完成后,可以在【Tools】->【NDK】->【javah】调用
自动生成jni
目录和.h
文件
3. jni文件
com_blog_demo_jni_NativeCalc.h
文件,由javah
自动生成。
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_blog_demo_jni_NativeCalc */
#ifndef _Included_com_blog_demo_jni_NativeCalc
#define _Included_com_blog_demo_jni_NativeCalc
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: com_blog_demo_jni_NativeCalc
* Method: add
* Signature: (DD)D
*/
JNIEXPORT jdouble JNICALL Java_com_blog_demo_jni_NativeCalc_add
(JNIEnv *, jobject, jdouble, jdouble);
/*
* Class: com_blog_demo_jni_NativeCalc
* Method: subtract
* Signature: (DD)D
*/
JNIEXPORT jdouble JNICALL Java_com_blog_demo_jni_NativeCalc_subtract
(JNIEnv *, jobject, jdouble, jdouble);
/*
* Class: com_blog_demo_jni_NativeCalc
* Method: multiply
* Signature: (DD)D
*/
JNIEXPORT jdouble JNICALL Java_com_blog_demo_jni_NativeCalc_multiply
(JNIEnv *, jobject, jdouble, jdouble);
/*
* Class: com_blog_demo_jni_NativeCalc
* Method: divide
* Signature: (DD)D
*/
JNIEXPORT jdouble JNICALL Java_com_blog_demo_jni_NativeCalc_divide
(JNIEnv *, jobject, jdouble, jdouble);
#ifdef __cplusplus
}
#endif
#endif
com_blog_demo_jni_NativeCalc.cpp
文件,实现了加减乘除四个方法
#include <jni.h>
#include "com_blog_demo_jni_NativeCalc.h"
JNIEXPORT jdouble JNICALL Java_com_blog_demo_jni_NativeCalc_add
(JNIEnv *env, jobject obj, jdouble left, jdouble right) {
return left + right;
}
JNIEXPORT jdouble JNICALL Java_com_blog_demo_jni_NativeCalc_subtract
(JNIEnv *env, jobject obj, jdouble left, jdouble right) {
return left - right;
}
JNIEXPORT jdouble JNICALL Java_com_blog_demo_jni_NativeCalc_multiply
(JNIEnv *env, jobject obj, jdouble left, jdouble right) {
return left * right;
}
JNIEXPORT jdouble JNICALL Java_com_blog_demo_jni_NativeCalc_divide
(JNIEnv *env, jobject obj, jdouble left, jdouble right) {
return left / right;
}
4. ndk编译
Android.mk
文件
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := calcLibs
LOCAL_SRC_FILES := com_blog_demo_jni_NativeCalc.cpp
include $(BUILD_SHARED_LIBRARY)
在【Tools】->【External Tools】中添加ndk-build
配置
在src\main\libs
目录下生成so
文件
5. build.gradle配置
对app
下的build.gradle
文件进行配置
android {
... ...
sourceSets {
main {
jni.srcDirs = [] // 屏蔽自动jni编译
jniLibs.srcDir "src/main/libs" // 引入so文件
}
}
... ...
}