android用jni调c/c++(包含eclipse和as)
1.下载ndk。打开Studio File>Project Structure>SDK Location
然后在Android NDKlocation里面填写sdk路径例:D:\study\androidStudioSDK\ndk-bundle
注意点:ndk路径最好不要太长,要是太长可能会报错。后期使用时如果碰到问题可以尝试删除ndk重新安装(我碰过这种问题大坑)
2. Windows7 64bit 配置NDK环境: https://blog.csdn.net/cadi2011/article/details/50327591
3.打开项目目录找到gradle>gradle-wrapper.properties然后在最后面加上一句android.useDeprecatedNdk=true
4.打开项目目录打开build.gradle 在defaultConfig{}里面添加
ndk {
moduleName "hello"//生成so包名称
abiFilters "armeabi"
}
5.选择工具栏里的View>Tool Windows>Terminal 然后再命令框里打入cd app\src\main\java 按回车然后打入javah -jni com.jni.jnitext5.Mainactivity之后会在app\src\main\java目录下生成.h文件。然后在app目录下创建jni文件夹把.h文件放入jni文件里面并在里面创建Android.mk Application.mk 和一个.c文件(现在jni里面有四个文件)
Android.mk文件里面写:
LOCAL_PATH:=$(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE:=hello
LOCAL_SRC_FILES:=gps.cpp
LOCAL_SHORT_COMMANDS:=true
include $(BUILD_SHARED_LIBRARY)
Application里面写:
APP_CFLAGS +=-Wno-error=format-security
APP_ABI := arm64-v8a armeabi-v7a x86 x86_64 armeabi
APP_SHORT_COMMANDS := true
.h文件里面写
/* DO NOT EDIT THIS FILE - it ismachine generated */
#include <jni.h>
/* Header for class com_jni_jnitext3_MainActivity */
#ifndef _Included_com_jni_jnitext5_MainActivity
#define _Included_com_jni_jnitext5_MainActivity
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: com_jni_jnitext3_MainActivity
* Method: add
* Signature: (II)I
*/
JNIEXPORT jint JNICALL Java_com_jni_jnitext5_MainActivity_add
(JNIEnv *, jobject, jint, jint);
#ifdef __cplusplus
}
#endif
#endif
.c文件里面写
/* DONOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
#include <android/log.h>
#ifndef LOG_TAG
#define LOG_TAG "ANDROID_LAB"
#define LOGE(...) __android_log_print(ANDROID_LOG_ERROR, LOG_TAG, __VA_ARGS__)
#endif
/* Header for class lab_sodino_jnitest_MainActivity */
#ifndef _Included_com_jni_jnitext5_MainActivity
#define _Included_com_jni_jnitext5_MainActivity
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: lab_sodino_jnitest_MainActivity
* Method: getStringFromNative
* Signature: ()Ljava/lang/String;
*/
JNIEXPORT jint JNICALL Java_com_jni_jnitext5_MainActivity_add
(JNIEnv * env, jobject jObj,int a,intb){
// LOGE("log string");
return a+b;
}
#ifdef __cplusplus
}
#endif
#endif
然后在MainActivity里面写入
这里的hello表示要加载的so库要和build.gradle里面ndk{}里面moduleName后面的名字一样。
调用c的方法是:在java代码里面写int a = add(2,3);
6.最后一步是生成so库,在命令框内回退到app目录下,然后输ndk-build得到
然后你会在app目录的libs下面看到so包,这个时候这些so包是不能用的还需在build.gradle里面添加
sourceSets{
main{
jniLibs.srcDirs = ['libs']
}
}
最后就可以运行程序了。
注意点:当你输入ndk-build的时候如果没有达到我上面的效果别着急,先看看出现了什么,有时候是你ndk路径不对,有时候是你studio版本太高等等,百度也有很多。如果实在不行可以重装ndk,或者私聊我。
第二次写博客可能写的不详细请各位见谅。欢迎各位有问题私聊和建议。eclipse的私聊我qq1185719419。