在Android上开发JNI,关键要搭建好平台。。。
在Android Studio中指定NDK位置,在项目中右键选中"Open Module Settings",在“SDK Location”下的"Android NDK location"下输入NDK的位置
然后在项目的gradle.properties文件中输入:
Android.useDeprecatedNdk=true
在app的build.gradle文件中 的 “defaultConfig” 下插入下面这句话:
ndk{ moduleName "Library"//生成的so库文件名 abiFilters "armeabi","armeabi-v7a","x86"//输出制定三种abi体系结构下的so库,目前应该可有可无.....最好加上 }
在android下输入:
sourceSets.main{ jni.srcDirs=['libs']//Error: Your project contains C++ files but it is not using a supported native build system错误解决办法 jniLibs.srcDir "src/main/libs" }
大概就是这样:
/**********************************************************************************************************************************/
然后写一个类,声明本地方法,加载库文件:
package com.crescert.myapplication;
public class NDKUtils {
static {
System.loadLibrary("Library");
}
public native String GetString();
}
在Activity调用方法就行。
然后进到java文件夹下(“工程位置”\app\src\main\java,这个文件夹下),在命令行下输入:
javah -jni com.crescert.myapplication.NDKUtils
在这之前要确保java环境已经搭建好,会生成“ com_crescert_myapplication_NDKUtils.h”文件。
在项目上右键依次选择“New”->"Folder"->"JNI Folder",点击Finish,会在main目录下生成命为jni的文件夹。
把之前的头文件"com_crescert_myapplication_NDKUtils.h"移动到这个目录下。
然后创建一个c文件(文件在生成后后缀名为.cpp,改成.c)。文件名随便,这里是Library,需要和LoadLibrary函数的参数字符串一样,内容为:
#include "com_crescert_myapplication_NDKUtils.h"
JNIEXPORT jstring JNICALL Java_com_crescert_myapplication_NDKUtils_GetString
(JNIEnv *env, jobject obj){
return (*env)->NewStringUTF(env,"This is mylibrary !!!");
}
创建Android.mk在jni文件夹下,内容如下:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := Library
LOCAL_SRC_FILES =: Library.c
include $(BUILD_SHARED_LIBRARY)
大概就是这了,接下来生成so库。进到jni的文件下,打开命令提示符,输入“ndk-build”。如果没问题会出现类似下图的结果:这样生成了so库,直接运行,就成功了。大概就是这些,有什么问题 再补充。
发现这样的话只会编译一种型号就是默认的armeabi的cpu型号,如果需要其他的型号,使用下面的办法:
来源自:http://www.cnblogs.com/mengshu-lbq/archive/2013/03/29/2988657.html
默认编译的是 armeabi 架构的。
如果有或创建Application.mk文件,则在该文件添加如下内容:
APP_ABI := armeabi armeabi-v7a x86
如果没有或不想使用Application.mk文件,则在ndk-build参数中添加
APP_ABI="armeabi armeabi-v7a x86 mips"
即运行:
ndk-build APP_ABI="armeabi armeabi-v7a x86 mips"
亲测有效