新的学习Android知识

Android JNI之HelloWorld

2016-09-08  本文已影响417人  esonyf

Android JNI是什么,别说你不知道,不知道的自行百度或者谷歌,这里不解释。由于谷歌力推AndroidStudio,所以这里主要以AndroidStudio为主进行讲解。

1、新建Android工程

1.1 、在项目根目录中的 gradle.properties 文件中增加

android.useDeprecatedNdk=true

1.2 、打开APP module中的 build.gradle,
增加代码到defaultConfig中

defaultConfig {
    applicationId “***********”
    minSdkVersion 14
    targetSdkVersion 23
    versionCode 1
    versionName "1.0"
    ndk {
        moduleName "hello-jni"   // 生成库的名称 默认前面会加 lib  ( libhello-jni.so )
    }
}
2、新建一个类

2.1、编写native方法

static {
        System.loadLibrary("hello-jni");
    }
    public native String  stringFromJNI();

2.2、新建jni目录,如下图:

屏幕快照 2016-09-08 17.59.51.png

2.2、点击AndroidStudio中 build -> make project

2.3、在 app/build/intermediates/classes/debug/… 路径找到 类.class(…为包名+类名)

2.4、生成头文件
在 Terminal 窗口中执行

javah -d [output目录] -classpath ./app/build/intermediates/classes/debug/ [包+类]

-d 后面的目录是生成 文件目录(指定到新建的jni目录)
-classpath 后面的目录是编译class目录
生成的头文件内容如下:

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_eson_hello_jni_JniUtil */

#ifndef _Included_com_eson_hello_jni_JniUtil
#define _Included_com_eson_hello_jni_JniUtil
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     com_eson_hello_jni_JniUtil
 * Method:    stringFromJNI
 * Signature: ()Ljava/lang/String;
 */
JNIEXPORT jstring JNICALL Java_com_eson_hello_jni_JniUtil_stringFromJNI
  (JNIEnv *, jobject);

#ifdef __cplusplus
}
#endif
#endif
3、在生成的jni目录中编写c文件代码

3.1、在jni目录,右键->New->C/C++ Source File
3.2 、编写代码:

#include "com_eson_hello_jni_JniUtil.h"
JNIEXPORT jstring JNICALL Java_com_eson_hello_jni_JniUtil_stringFromJNI
        (JNIEnv *env, jobject thiz) {


#if defined(__arm__)
#if defined(__ARM_ARCH_7A__)
#if defined(__ARM_NEON__)
#if defined(__ARM_PCS_VFP)
#define ABI "armeabi-v7a/NEON (hard-float)"
#else
#define ABI "armeabi-v7a/NEON"
#endif
#else
#if defined(__ARM_PCS_VFP)
#define ABI "armeabi-v7a (hard-float)"
#else
#define ABI "armeabi-v7a"
#endif
#endif
#else
#define ABI "armeabi"
#endif
#elif defined(__i386__)
#define ABI "x86"
#elif defined(__x86_64__)
#define ABI "x86_64"
#elif defined(__mips64)  /* mips64el-* toolchain defines __mips__ too */
#define ABI "mips64"
#elif defined(__mips__)
#define ABI "mips"
#elif defined(__aarch64__)
#define ABI "arm64-v8a"
#else
#define ABI "unknown"
#endif

    return (*env)->NewStringUTF(env, "Hello from JNI !  Compiled with ABI " ABI ".");

}


这里直接拷贝的ndk-samples里面hello-jni的源码。

4、调用
public class HelloJni extends AppCompatActivity {
    /**
     * Called when the activity is first created.
     */
    JniUtil jniUtil = new JniUtil();

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        /* Create a TextView and set its content.
         * the text is retrieved by calling a nativecd
         * function.
         */
        TextView tv = new TextView(this);
        tv.setText(jniUtil.stringFromJNI());
        setContentView(tv);
    }

}
5、运行代码

运行之后会在手机屏幕显示出“Hello from JNI ! Compiled with ABI armeabi”等。

到此,我们第一个jni项目完成了。

上一篇下一篇

猜你喜欢

热点阅读