Android Studio 上JNI开发

来源:互联网 发布:php集成开发环境 编辑:程序博客网 时间:2024/06/05 07:13

在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 := LibraryLOCAL_SRC_FILES =: Library.cinclude $(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"


亲测有效

 
原创粉丝点击