Android JNI之HelloWorld

作者: esonyf | 来源:发表于2016-09-08 20:07 被阅读417次

    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项目完成了。

    相关文章

      网友评论

        本文标题:Android JNI之HelloWorld

        本文链接:https://www.haomeiwen.com/subject/spwsettx.html