美文网首页
Android JNI使用(Android Studio)

Android JNI使用(Android Studio)

作者: 大大大寒 | 来源:发表于2016-11-30 12:00 被阅读114次

    java native interface (JNI)学习
    java和C/C++各有优缺点,有时用C/C++实现更好,所以需要调用native方法
    首先下载好NDK
    NDK下载
    下面步骤:
    1:先创建一个类,其中有native方法
    (System.loadLibrary("JniTest");JniTest:引入的库名)

    
    public class MyJNI {
    
        public static native String getString();
    
        static {
            System.loadLibrary("JniTest");
        }
    
    }
    

    2,使用javac生成.class文件
    根据你的目录和包名执行下面命令
    D:\develop\JniTest>cd D:\develop\JniTest\app\src\main\java\han\jnitest\

    D:\develop\JniTest\app\src\main\java\han\jnitest>javac MyJNI.java

    如图你会生成一个class文件

    3,使用javah生成.h文件
    执行(javah -jni 你的包名加类名)
    javah -jni han.jnitest.MyJNI

    切换到java目录(我也不知道为啥,不切换就找不到文件)

    所以正确如图

    这个时候就生成了.h文件,我的就在java目录下

    /* DO NOT EDIT THIS FILE - it is machine generated */
    #include
    /* Header for class han_jnitest_MyJNI */
    #ifndef_Included_han_jnitest_MyJNI
    #define_Included_han_jnitest_MyJNI
    #ifdef__cplusplus
    extern"C"{
    #endif
    /*
    * Class:    han_jnitest_MyJNI
    * Method:    getString
    * Signature: ()Ljava/lang/String;
    */
    JNIEXPORT jstring JNICALL Java_han_jnitest_MyJNI_getString
    (JNIEnv *, jclass);
    #ifdef__cplusplus
    }
    #endif
    #endif
    

    这个时候我们要对其修改

    /* DO NOT EDIT THIS FILE - it is machine generated */
    #include
    /* Header for class han_jnitest_MyJNI */
    #ifndef_Included_han_jnitest_MyJNI
    #define_Included_han_jnitest_MyJNI
    #ifdef__cplusplus
    extern"C"{
    #endif
    /*
    * Class:    han_jnitest_MyJNI
    * Method:    getString
    * Signature: ()Ljava/lang/String;
    */
    JNIEXPORT jstring JNICALL Java_han_jnitest_MyJNI_getString
    (JNIEnv *env, jclass jobj){
    return(*env)->NewStringUTF(env,"JNI Test");
    }
    #ifdef__cplusplus
    }
    #endif
    #endif
    

    4,添加配置
    main目录下创建jni目录
    创建一个.c文件名字随意(我的是JniTest.c)把han_jnitest_MyJNI.h修改后的内容复制进来
    再创建一个util.c空文件(没有会报空,也不知道为啥,好像其他名字也行..)
    gradle.properties文件配置

    android.useDeprecatedNdk=true
    

    local.properties文件配置ndk路径(你自己的路径)

    ndk.dir=D\:\\sdk\\ndk\\android-ndk-r10b
    

    build.gradle文件配置

    ndk {
    //JniTest生成的so名字
    moduleName"JniTest"
    abiFilters"armeabi","armeabi-v7a","x86"
    }
    

    一切都完成之后rebulid project一下

    生成的so文件路径XXXXX\JniTest\app\build\intermediates\ndk\debug\lib

    main下创建一个jniLibs目录 把生成的文件复制然后调用

    效果如下

    第一次使用简书添加代码怪怪的,
    有什么疑惑或者不懂的 可在下面留言一起学习哈
    如有错误也请指出留言谢谢

    相关文章

      网友评论

          本文标题:Android JNI使用(Android Studio)

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