美文网首页Android好文收录AndroidWorldandroid
超级简单的Android Studio jni 实现(无需命令行

超级简单的Android Studio jni 实现(无需命令行

作者: alexis_zyp | 来源:发表于2016-02-28 13:50 被阅读30686次

    1.配置Anroid Studio(这步是关键)

    使用[command+,] 打开Preferences,选择External Tools,点击加号框如下图:


    Paste_Image.png

    点击+号之后,打开Macros 配置宏命令界面,如下图:

    Paste_Image.png setting.png javah.png ndk-build.png ndk-build clean.png

    2.配置完成就可以使用javah 、ndk-build、ndk-build clean这三个命令了,那么在哪里使用这些命令,请看下图

    tools.png

    3.配置完成,我们开始新建工程MyNdk,然后新建jni目录

    create jni.png

    4.修改app下的build.gradle文件, 如下图

    ndk{    
      moduleName "MyLibrary"
    }
    sourceSets.main{
        jni.srcDirs = []    
        jniLibs.srcDir "src/main/libs"
    }
    
    app build.gradle.png

    5.修改MyNdk下的gradle.properties文件(如果没有此文件,自己新建一个),如下图

    android.useDeprecatedNdk=true
    
    MyNdk gradle.properties.png

    6.新建MyNdk.java

    public class MyNdk {
       static {
           System.loadLibrary("MyLibrary");    
    }   
       public native String getString();
    }
    
    MyNdk.java.png

    注:先build下整个工程,然后执行第7步
    7.这步开始创建头文件,操作如下图(注意在MyNdk.java文件上点击右键)

    create com_zhangyp_higo_myndk_MyNdk.h file.png

    8.执行完成后jni目录下就创建了com_zhangyp_higo_myndk_MyNdk.h文件,然后我们在jni目录下编写 MyLibrary.cpp、Android.mk、Application.mk这三个文件,代码如下:


    jni files.png

    com_zhangyp_higo_myndk_MyNdk.h

    /* DO NOT EDIT THIS FILE - it is machine generated */
    #include <jni.h>
    /* Header for class com_zhangyp_higo_myndk_MyNdk */
    
    #ifndef _Included_com_zhangyp_higo_myndk_MyNdk
    #define _Included_com_zhangyp_higo_myndk_MyNdk
    #ifdef __cplusplus
    extern "C" {
    #endif
    /*
     * Class:     com_zhangyp_higo_myndk_MyNdk
     * Method:    getString
     * Signature: ()Ljava/lang/String;
     */
    JNIEXPORT jstring JNICALL Java_com_zhangyp_higo_myndk_MyNdk_getString
      (JNIEnv *, jobject);
    
    #ifdef __cplusplus
    }
    #endif
    #endif
    

    MyLibrary.cpp

    #include "com_zhangyp_higo_myndk_MyNdk.h"
    
    JNIEXPORT jstring JNICALL Java_com_zhangyp_higo_myndk_MyNdk_getString
      (JNIEnv * env, jobject obj){
       return (*env).NewStringUTF("This is mylibrary !!!");
      }
    

    Android.mk

    LOCAL_PATH := $(call my-dir)
    
    include $(CLEAR_VARS)
    
    LOCAL_MODULE := MyLibrary
    LOCAL_SRC_FILES =: MyLibrary.cpp
    include $(BUILD_SHARED_LIBRARY)
    
    

    Application.mk

    APP_MODULES := MyLibrary
    APP_ABI := all
    

    9.如何执行ndk-build,请看下图:(注意在jni目录上点击右键)

    make ndk-build .png

    10.得到so文件,如下图

    so file.png

    12.在MainActivity中调用,代码如下

    public class MainActivity extends AppCompatActivity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            TextView tv = (TextView) findViewById(R.id.tv);
    
            tv.setText(new MyNdk().getString());
    
        }
    }
    

    12.大功告成,可以运行了,oh yet!

    补充:app的build.gradle 加入如下脚本,C/C++ 代码就有自动提示了,也可以方法间跳转

      externalNativeBuild {
            ndkBuild {
                path 'src/main/jni/Android.mk'
            }
        }
        sourceSets.main{
            jni.srcDirs = ['src/main/jni']
            jniLibs.srcDir "src/main/libs"
        }
    
    MyLibrary.png

    13.如果需要使用Android Studio调试c/c++请看这篇文章:Android Studio NDk调试(基于gradle-experimental插件与LLDB)

    1.Android端使用retrofit上传多张图片,后端使用Php接收图片(包含前后端代码)
    2.Android Studio NDk调试(基于gradle-experimental插件与LLDB)
    3.让Android开发者相见恨晚的软件及插件
    4.GitHub上一些超炫的Android开源项目推荐

    相关文章

      网友评论

      • sdjvsjjsc:cmake写ndk也挺方便的。
      • 酷菜:楼主你好,在Android Studio编写.c文件时,如果没有代码提示要怎么解决了,有的电脑可以,有的电脑行 就比如 (*env)-G 它不会匹配提示
      • 酷菜:问下楼主,就是Android studio 配置好了 创建.c文件准备写实现 但是在c文件中编写代码的时候,编写env->G 没有代码提示 这个问题你遇到过么
      • Robo_G:楼主有没有遇到过c文件很小,但是生成的so文件很大的情况啊?我用的cmake
      • 性冷淡_:请问下配置Javah工具之后,报找不到类文件,是不是需要将项目的路径也配置到path环境下面?
      • 437bc4dbf942:大神在吗?您文章的第5点,5.修改MyNdk下的gradle.properties文件(如果没有此文件,自己新建一个),具体怎么新建呢,能告知步骤吗。我有时候从adt项目转到studio会没有这个文件。有时候更改gradle配置可能会成功,有时候不行。您有什么好的步骤,谢谢。我邮箱1418185347@qq.com
      • fb5fbf432e63:好像也很复杂 是吗
        fb5fbf432e63:@zzyyppqq 大神再写一篇最快的
        alexis_zyp:@心若浅沙 可以使用最新版本的android studio和ndk就可以创建支持jni的实现,默认cmake编译
      • a3d20a0f64eb:大神您好,在Windows环境下配置ndk-build的时候提示 Error running ndk-build: Cannot run program ...... CreateProcess error=5, 拒绝访问。怎么处理呢?
      • 294e654011d4:执行第七步为什么说JNI not exists? 检查了好几次
      • 8d08bacd2635:多谢博主,今天报了一天的错用你的方法总算解决了
      • 5ea4beb37efa:楼主,您好我是小米工程师,能加个微信好友吗?我的微信shaoxy1992,可以的话备注写NDK哈。
      • d635aa4c7c24:配置javah工具那里,如果SDK的安装路径有空格,就要给$Classpath$加上双引号括住,不然会参数错误。
        改成这样:
        -classpath "$Classpath$" -v -jni $FileClass$
        d635aa4c7c24:刚写完JAVA的AndroidJni这个class的时候,使用javah是会失败的,因为此时还没有生成AndroidJni的class文件,所以要先Rebuild一下,再用javah
      • 李梦成:请问编写C++代码时没有代码提示怎么解决啊?
        alexis_zyp:在.c pp文件中,不要导入javah命令生成的头文件,可以看我的这篇文章:开发一个优秀的Android应用你必须要加入的代码及配置(http://www.jianshu.com/p/cdc24240f3ca)里面有说明
      • 李梦成:找不到类文件啊
      • 散枫:楼主,我是在buid-ndk出错了,Error running ndk-build: Cannot run program "D:\Users\Administrator\AppData\Local\Android\sdk\ndk-bundle\ndk-build" (in directory "E:\Users\Administrator\AndroidStudioProjects\CarPlate\app\src\main"): CreateProcess error=2, 系统找不到指定的文件。我的app是放在E盘的,这个有影响么
      • 炸鸡叔:好文章
      • c1e6774eb33c:windows下为ndk-build.cmd
      • kimonik:出现这个错误是怎么回事?请解答一下,谢谢 :smile:
        Error:(6, 0) Could not find property 'android' on repository container.
        <a href="openFile:C:\Users\Administrator\Desktop\1607\17day\MyJniDemo\build.gradle">Open File</a>
      • b23bf91c2aa7:谢谢 楼主分享,学习了
      • 悟幻新:第4步会报错,是不是gradle版本有关?
        Error:(15, 0) Gradle DSL method not found: 'ndk()'
        Possible causes:<ul><li>The project 'MyJNI' may be using a version of Gradle that does not contain the method.
        <a href="openGradleSettings">Gradle settings</a></li><li>The build file may be missing a Gradle plugin.
        <a href="apply.gradle.plugin">Apply Gradle plugin</a></li>
      • a8ec1dc5fd45:为什么我照着上面的步骤会提示以下错误?
        求定位
        "C:\Program Files\Java\jdk1.7.0_80\bin\javah" -bootclasspath E:\android-sdk\platforms\android-21\android.jar -o E:\AndroidSource\Demos\TestNDK\app\src\main\jni com.tpg.rcs.testndk.MyNdk
        Exception in thread "main" java.lang.IllegalArgumentException: directories not supported
        at com.sun.tools.javac.file.RegularFileObject.<init>(RegularFileObject.java:68)
        at com.sun.tools.javac.file.RegularFileObject.<init>(RegularFileObject.java:62)
        at com.sun.tools.javac.file.JavacFileManager.getJavaFileObjectsFromFiles(JavacFileManager.java:805)
        at com.sun.tools.javah.JavahTask.run(JavahTask.java:468)
        at com.sun.tools.javah.JavahTask.run(JavahTask.java:335)
        at com.sun.tools.javah.Main.main(Main.java:46)

        Process finished with exit code 1
        伍步书:@卡尔码龙 -classpath "$Classpath$" -v -jni $FileClass$
        加一个引号就可以了,参考链接:http://stackoverflow.com/questions/40158542/i-am-trying-to-generate-h-file-in-android-studio-for-ndk
      • Runxing:先make 下再ndk-build
      • 9f6d46ac9717:为什么在android N +JDK1.8 +AS 2.1.2 上生产不了class文件;
        但是在android N 以下(测试5.1 sdk22)生可以生成…why :broken_heart:
      • 381c857b4198:Exception in thread "main" java.lang.IllegalArgumentException: Not a valid class name: (x86)\Java\jdk1.8.0_92\jre\lib\charsets.jar;D:\Program
        at com.sun.tools.javac.api.JavacTool.getTask(JavacTool.java:129)
        at com.sun.tools.javac.api.JavacTool.getTask(JavacTool.java:107)
        at com.sun.tools.javac.api.JavacTool.getTask(JavacTool.java:64)
        at com.sun.tools.javah.JavahTask.run(JavahTask.java:503)
        at com.sun.tools.javah.JavahTask.run(JavahTask.java:329)
        at com.sun.tools.javah.Main.main(Main.java:46)
        这是什么原因啊。楼主,有没有demo,给发个呗
        伍步书:-classpath "$Classpath$" -v -jni $FileClass$
        加一个引号就可以了,参考链接:http://stackoverflow.com/questions/40158542/i-am-trying-to-generate-h-file-in-android-studio-for-ndk
        2da1461eccca:你的jdk环境变量中有空格,不要把jdk放到program(x86) Files下
        Jay简爱:@抓狂的黑猫 我也遇到了
      • 733152286a95:每次都必须手动创建mk文件吗,而且c的代码没有提示吗 好费劲啊
        alexis_zyp:@elohim google新出了一款gradle插件,不需要写mk文件,我的另一篇文章有写
      • Android技术研究:我只编译出了armeabi文件夹下的一个so,按照你给的配置去做的,其他除了第七步需要make一下,其他的都是可以的,谢谢。
        alexis_zyp:@Android技术研究 嗯,可能是ndk的问题,你也可以使用这种更简单的方法,http://www.jianshu.com/p/7844aafe897d
        Android技术研究:@zzyyppqq APP_ABI := all一直加的有这个,还是没编译出来,估计是我环境出问题了。
        alexis_zyp:@Android技术研究 APP_ABI := all 就可以编译出全部的so
      • lumenghz:我执行ndk-build的时候出现Error running ndk-build: Cannot run program "Users/lumeng/Library/Android/sdk/ndk-bundle" (in directory "Users/lumeng/...projectpath/src/main"):error=13, Permission denied
        请指教
        lumenghz:@zzyyppqq 谢谢你的回答,已经解决,路径错误,我ndk-bundle/后面没加ndk-build。现在不会报Permission denied错误了。非常感谢你的分享。
        alexis_zyp:@lumenghz 你的sdk放到Library下了,需要sudo前缀,不然会报Permission denied。你在配置界面加入sudo Users/lumeng/Library/Android/sdk/ndk-bundle试试
      • aeb8c27be21c:既然都用AS2.0 beta6了为何不直接使用官方推荐的方式实现jni,而要用废弃的api,参考http://tools.android.com/tech-docs/new-build-system/gradle-experimental
        alexis_zyp:@陈启超_V :+1: 谢谢,对gradle-experimental有兴趣的简友可以去这里看看http://ph0b.com/new-android-studio-ndk-support/
      • 4072cdde299e:喜欢!
      • 024a6bba9544:as版本是多少的了,JAVA的版本号是多少了
        alexis_zyp:@魂魄 Android Studio版本应该是2.0 Beta6 Java version 1.8
      • johnzz:大神,很给力的例子。谢谢分享。 :blush:
        alexis_zyp:@johnzz 我更新了这篇文章,加入了更详细的步骤,你看看,就明白了
        johnzz:楼主。你QQ多少呢。请问下,第一步里面。那个external tools下面三个命令是怎么加进去的呢。我那个里面是空的啊。怎么配置这个工具呢 :pray: 先谢了哈
        alexis_zyp:@johnzz 谢谢😄

      本文标题:超级简单的Android Studio jni 实现(无需命令行

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