Android Studio下使用JNI编程备忘录

来源:互联网 发布:2017流行的网络用语 编辑:程序博客网 时间:2024/06/05 23:52

1、下载安装NDK的过程略过,网上资料很多。

JNI官网规范见 http://docs.oracle.com/javase/7/docs/technotes/guides/jni/spec/jniTOC.html


2、修改local.properties

如图,增加ndk路径。



3、修改app/build.gradle

代码如下,defaultConfig中增加ndk,模块名为java类名,abiFilters为底层架构。增加sourceSet。

import org.apache.tools.ant.taskdefs.condition.Osapply plugin: 'com.android.application'android {    compileSdkVersion 22    buildToolsVersion "21.1.2"    defaultConfig {        applicationId "cn.lxg.jniHello"        minSdkVersion 12        targetSdkVersion 22        versionCode 1        versionName "1.0"        ndk {            moduleName "MyNativeMethod"            stl "stlport_static"            ldLibs "log"            abiFilters "armeabi", "armeabi-v7a", "x86"        }    }    buildTypes {        debug {            // 显示Log            buildConfigField "boolean", "LOG_DEBUG", "true"            minifyEnabled false            shrinkResources true        }    }    sourceSets {        main {            jniLibs.srcDirs = ['libs']        }    }}dependencies {    compile fileTree(dir: 'libs', include: ['*.jar'])}
4、新建java class,名字要与gradle中一致

定义了一个native的函数Display,在C中实现。

package cn.lxg.jniHello;/** * Created by 李晓光 on 2016/4/5. * */public class MyNativeMethod {    static {        System.loadLibrary("MyNativeMethod");    }    public native String DisplayHello();}

5、新建native的.h文件和.cpp文件

h文件,注意文件名要严格按规范,与java类名一致。

#ifndef _Included_cn_lxg_jniHello_MyNativeMethod#define _Included_cn_lxg_jniHello_MyNativeMethod#ifdef __cplusplusextern "C" {#endif#include <jni.h>#include <android/log.h>#ifndef LOG_TAG#define LOG_TAG "MyNativeMethod"#define LOGE(...) __android_log_print(ANDROID_LOG_ERROR, LOG_TAG, __VA_ARGS__)#endif/** Class:* Method:* Signature:*/JNIEXPORT jstring JNICALL Java_cn_lxg_jniHello_MyNativeMethod_DisplayHello(JNIEnv *, jobject);#ifdef __cplusplus}#endif#endif
cpp文件,用了jni的函数生成一个jstring。

#include "cn_lxg_jniHello_MyNativeMethod.h"JNIEXPORT jstring JNICALL Java_cn_lxg_jniHello_MyNativeMethod_DisplayHello(JNIEnv *env, jobject){    LOGE("Hello! This is Lee!");    char cStr[] = "Hello! This is Lee!";    jstring str = env->NewStringUTF(cStr);    return str;}

6、在Android程序中调用native函数

编译,运行,完成。



0 0