ndk环境搭建(HelloJNI开发)

ndk环境搭建(HelloJNI开发)

ndk允许开发者使用原生代码(c/c++)实现应用的一部分,在某种情况下可以提高程序的运行效率。

  • 工具:

    • eclipse+ADT
    • android-ndk-r10b(试过r13的,编译出错,找过好多资料没解决)

    如果你的电脑还行,还是使用as吧,eclipse伤不起。

  • 设置ndk路径

    • 打开eclipse –> window –> preferences –> android –> ndk 设置ndk路径
  • 新建一个android项目

    • 新建一个Android工程,在工程上右键点击Android Tools->Add Native Support…,然后给我们的.so文件取个名字,例如:hello-jni

    • 工程就会多一个jni的文件夹,jni下有Android.mk和hello-jni.cpp文件。Android.mk是NDK工程的Makefile,hello-jni.cpp就是NDK的源文件。

      • 如果你熟悉c语言可以把my-ndk.cpp改为my-ndk.c, 相应的将Android.mk里改为.c

        LOCAL_SRC_FILES := hello-jni.c
        
    • cpp编写

      • JNI接口的命名规范是:
        • Java_ + 调用该方法的包名(包名的点用代替) + + 调用该接口的类名 + _ + 方法名,对于实例方法,有两个参数是必要的,一个JNI的环境指针JNIEnv *,另一个是调用该方法的Java实例jobject
      • example:

        hell-jni.cpp:

        #include <jni.h>
        
        JNIEXPORT jstring JNICALL Java_com_shamoo_activity_TestActivity_stringFromJNI(JNIEnv *env,
                jobject thiz) {
            return env->NewStringUTF("Hello jni");
        }
        

        此处你在编写时可能会出现错误,请看备注里的

    • 声明JNI层的原生方法,使用native关键字

      public native String stringFromJNI();
      
    • 使用ndk库必须在static代码块里面用System.loadLaibrary加载.so库

    完成了,然后运行。运行之前先编译NDK,然后在编译JAVA代码。

备注:

  • eclipse 选择ndk目录时如果出现 Not a invalid ndk directory 时,需要在ndk的目录下建一个ndk-build 空文件

  • 编译也许会遇到Unable to launch cygpath. Is Cygwin on the path?错误,解决办法如下:

    • 工程右键,点Properties->C/C++ Build的Building Settings中去掉Use default build command,然后输入${NDKROOT}/ndk-build.cmd
    • 在C/C++ Build中点击Environment,点Add…添加环境变量NDKROOT,值为NDK的根目录
  • 运行时崩溃,遇到java.lang.UnsatisfiedLinkError: stringFromJNI错误,解决办法:

    • 在C++文件中函数定义前添加extern “C”修饰

    • 原因是:使用extern “C”修饰,编译器会按C语言的方式编译和连接。在C语言中,函数编译之后函数名与C++函数编译之后不同,例如foo(int x, int y),C可能会编译成_foo的名字,而C++因为支持重载,所以会编译成像_foo_int_int这种带参数的函数名。如果是按照C语言的编译方式,调用foo函数是找不到_foo的函数名就会报出函数名找不到的错误。所以要添加extern “C”修饰。

  • eclipse android ndk 提示Type ‘JNIEnv’ could not be resolved 等信息解决办法

    是由于没有将jni.h导入的缘故,而这个文件在ndk的目录下面。所以,参照以下步骤:

    Project Properties -> C/C++ General -> Path and Symbols
    选择include标签,Add ->ndk目录/platforms/android-14/arch-arm/usr/include
    且选中All languages.
    最后Apply -> OK
    这样错误就解决了。

  • c++ 使用的是env->函数名
    c 使用的是(*env)->
posted @ 2016-11-29 16:45  jxiaow  阅读(51)  评论(0编辑  收藏  举报