版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/jing85432373/article/details/78203605
1.在java代码中创建一个类
public class AddNum{
//这里调用c的方法
public native int add(int a,int b);
static {
//加载动态库
System.loadLibrary("add");
}
}
2.生成c的头文件
在java代码所在的包下(最上层,as可以直接在Terminal)输入命令,生成头文件
javah -jni com.***.***.**.AddNumc
3.创建一个jni文件夹
注意文件路径,as切换到Project模式,在main下创建jni文件夹,创建完成后与java文件夹处于同级目录
将第二步生成的文件拷贝到jni文件夹下,并创建对应的.c文件和android.mk文件
android.mk
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := add
LOCAL_SRC_FILES := AddNum.c
include $(BUILD_SHARED_LIBRARY)
LOCAL_MODULE := add
LOCAL_SRC_FILES := AddNum.c
这两句是最关键的,第一行定义生成的so文件名字,在第一步中使用这个名字,注意名字前面的lib问题
如果名字前面不加lib系统会自动添加
第二行是引用那个文件
4. 执行命令得到so文件
ndk-build
此时会根据不同cup生成对应so包,生成的so在libs下
$ ndk-build
[arm64-v8a] Install : libadd.so => libs/arm64-v8a/libadd.so
[x86_64] Install : libadd.so => libs/x86_64/libadd.so
[mips64] Install : libadd.so => libs/mips64/libadd.so
[armeabi-v7a] Install : libadd.so => libs/armeabi-v7a/libadd.so
[armeabi] Install : libadd.so => libs/armeabi/libadd.so
[x86] Install : libadd.so => libs/x86/libadd.so
[mips] Install : libadd.so => libs/mips/libadd.so
com_kaelthas_demo_ndk_test_AddNum.h
自动生成,命名规则Java_包名_类名(可以直接手写,注意命名规范)
方法名 类名_方法名
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_kaelthas_demo_ndk_test_AddNum */
#ifndef _Included_com_kaelthas_demo_ndk_test_AddNum
#define _Included_com_kaelthas_demo_ndk_test_AddNum
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: com_kaelthas_demo_ndk_test_AddNum
* Method: add
* Signature: (II)I
*/
JNIEXPORT jint JNICALL Java_com_kaelthas_demo_ndk_test_AddNum_add
(JNIEnv *, jobject, jint, jint);
#ifdef __cplusplus
}
#endif
#endif
AddNum.c
自己手动创建,命名自己确定,没有强制规范
//
// Created by 王晓明 on 2017/10/11.
//
#include "com_kaelthas_demo_ndk_test_AddNum.h"
JNIEXPORT jint JNICALL Java_com_kaelthas_demo_ndk_test_AddNum_add
(JNIEnv *env, jobject thiz, jint a, jint b){
return a+b;
}