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接口的命名规范是:
声明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)->