*************************************************华丽的分割线**************************************************************
NDK 开发步骤
1.建立一个项目
2.建立JNI目录
3.编写nativejava层方法
4.生成JNI头文件
(1)编写javaNative代码
(2)介绍一个命令javah
(3)添加android.jar包到环境变量html
声明一个native方法java
建立JNI目录android
控制台进入当前项目目录c++
输入命令
E:\android workspace\HelloNDK_1>javah -classpath bin/classes;D:\android\android_
sdk_windows\platforms\android-19\android.jar -d jni com.example.hellondk_1.MainA
ctivity
生成JNI头文件(其中,D:\android\android_sdk_windows\platforms\android-19\android.jar,
是android sdk目录下的目录文件,为了简单,能够把android.jar文件目录添加到path路径下;
最后com.example.hellondk_1.MainActivity是包名加类名)windows
刷新项目能够看到jni目录下多了一个.h文件数组
建立一个.c文件导入相应的头文件
(
如:建立一个hello.c文件
#include<stdio.h>
#include<stdlib.h>
#include"com_example_hellondk_1_MainActivity.h"oracle
JNIEXPORT jstring JNICALL Java_com_example_hellondk_11_MainActivity_getStringFromC
(JNIEnv *env, jclass jclass){eclipse
return (*env)->NewStringUTF(env, "Hello from C !....");
}
其中实现了头文件中的方法Java_com_example_hellondk_11_MainActivity_getStringFromC(JNIEnv *, jclass);
)ide
在jni目录下添加mk文件。(这个能够导入ndk的实例下面的mk文件而后作修改就能够了)以下
LOCAL_PATH := $(call my-dir)ui
include $(CLEAR_VARS)
LOCAL_MODULE := hello
LOCAL_SRC_FILES := hello.c
include $(BUILD_SHARED_LIBRARY)
其中,
LOCAL_MODULE 表示编译生成的so叫什么名字
LOCAL_SRC_FILES 表示要编译的.c文件是哪一个
最后在项目路径下执行ndk-build命令。
执行完以后对项目进行刷新能够看到项目下面多了一个obj目录里面多了一个.so文件。
而后在java文件中添加静态代码块。添加.so文件。
最后运行代码就能够看到结果了。
*************************************************华丽的分割线**************************************************************
JNIEnv* env表示当前线程的环境
jobject thiz表示当前的实例
jint si 表示一个int类型的变量
jfieldID fid表示一个字段或者java某一个属性。
jclass cls表示一个类或实例
jmethodID mid表示某个类里面的某个方法的id
cls=(*env)->GetObjectClass(env,thiz);
mid=(*env)->GetStaticMethodID(env,cls,"callback","()V")//第三个参数表示一个静态方法名
fid=(*env)->GetStaticFieldID(env,cls,"si","I");//后面两个表示变量名和数据类型
si=(*env)->GetStaticIntFieldId(env,cls,fid);//取得fid这个字段里面的si数据赋值给si
LOCAL_LDLIBS+=-llog//在mk文件中添加日志库
#include<android/long.h>//在c文件中添加这个头文件加入android开发的log
_android_log_print(ANDROID_LOG_INFO,"stringFromJNI()","xxx");//打印信息
_android_log_print(ANDROID_LOG_INFO,"stringFromJNI()","var=",var);//打印变量信息
java---->jni----->c/c++数据转换顺序
JNI数组处理
不少方法能够在D:\android\android-ndk-r9c\platforms\android-16\arch-arm\usr\include\h=jni.h头文件里面查看还有官方文档
*************************************************华丽的分割线**************************************************************
Eclipse配置ndk开发(参考视频教程:http://www.imooc.com/video/8028)
1、在Eclipse中选择ndk目录(Window--->Preferences--->Android---->NDK---->在NDK Location中选择ndk的目录位置)
2、配置生成javah选项
选择External Tools(运行按钮旁边的那个里面)----->选择Program右键new----->输入Name(如generate_c++_header_file)
----->在Main标签页下选择Variables(选择System_path而后加冒号:添加javah)------>而后选择Working Directory
添加Variables(选择project_loc而后添加\jni例如"${project_loc}\jni")------>而后添加Arguments参数
(-classpath ${project_loc}\bin\classes;D:\android\android_sdk_windows\platforms\android-19\android.jar -d
${project_loc}\jni -jni ${java_type_name})其中$xxx能够在Eclipse里面选择。----->最后run出现eclipse出现的
错误不要管。
使用即在项目下面新建一个jni目录。而后在java文件里面添加native方法,而后选中这个java文件,而后选择运行按钮
旁边的绿色按钮选择咱们配置好的generate_c++_header_file点击运行,而后刷新一下就能够看到jni目录下面生成了.h文件
(注意:工做目录最好不要带空格不然会出现一些错误)。
3、配置eclipse添加native支持jni方法代码提示
在工做目录右键选择android Tools--->add native support
选择项目右键选择properties---->C++General--->Path and Symbols--->Includes下add---->File System
(选择ndk所在目录下的include:例如"D:\android\android-ndk-r9c\platforms\android-19\arch-arm\usr\include")
而后单击应用,而后项目下面就多了一个Includes文件夹
而后就能够在编写jni代码的时候按住ctrl+alt或alt+/获得代码提示
4、配置生成javap选项
相似配置javah,
Location为${system_path:javap}
Working Directory为${project_loc}
Arguments为-classpath ${project_loc}\bin\classes -s -p ${java_type_name}
还能够配置ndk-build命令
*************************************************华丽的分割线**************************************************************JNI数据类型讲解(参考官网:http://docs.oracle.com/javase/6/docs/technotes/guides/jni/spec/types.html#wp428或者博客:http://blog.csdn.net/conowen/article/details/7523145)*************************************************华丽的分割线**************************************************************