NDK解析

NDK开发
工具:
1.下载相关ndk开发包(R9d)
2.配置ndk相关环境变量(Path中添加ndk-build所在目录)
3.配置eclipse相关开发工具(adt23)
4.导入ndkdemo(进入cmd到该项目的目录下,编译ndk-build生成obj的so文件)
如果不编译,则项目运行出错;若要使得编译快速,即为使用jni中application.mk使用“#”号注释掉all。
5.配置genymotion模拟器(我使用自带的模拟器可以正常运行)

第一个ndk项目
1.创建安卓项目
2.编写nativejava方法
3.创建jni目录–放置c/c++所需要的文件和头文件,利用javah生成头文件
4.创建.c文件 引用刚刚生成的头文件,然后实现里面的方法//返回字符串
5.Android.mk文件 –编译的so文件名字和编译的是哪个c文件 上面的demo中也有一个application.mk文件,用来指定生成的so文件机型是全部,注释掉就是默认的arm
6.ndk build生成so(链接库)
7.主Activity中使用静态代码块加载so文件library,然后使用布局显示方法的返回值
①编写javanative代码 只是写一个publicstatic native String getStringFromC();声明并且有native即可
②介绍一个命令javah 指令:javah -classpath 加载类途径名 -d jni 包名类名
③添加android.jar包到环境变量 与②相关

ndk介绍:

1.ndk是什么?
原生二进制代码。
开发c/c++的交叉编译包ndk、

2.什么场景可以应用ndk?
①代码的保护,由于apk的Java层代码很容易被反编译,而c/c++库反汇编难度较大
②在ndk中调用第三方C/C++库,因为大部分的开源库都是c/c++代码写的,ndk使用交叉编译生成Android可用类型
③便于移植,用c/c++写的库可以方便在其他的嵌入式平台上再次使用

3.什么是交叉编译?
简单的说就是在一个平台上生成另一台平台上可执行的代码。如x86和arm两种平台

4.jni是什么?
Java Native Interface标准成为Java平台的一部分,它允许Java代码和其他语言写的代码进行交互

5.什么是链接库so
静态链接库:依赖的资源全部编译集成,可以放到任何地方使用。体积较大
动态链接库:只是编译了功能,在运行时候在本地项目中查找所需资源。体积小

6.make文件介绍 (.mk)

命令行的ndk-build麻烦,那么就配置eclipse环境
首先是window->preferences->Android中ndk在其Location中放入ndk R9d开发包;
然后就是对所要编译项目的属性修改:右键->property->Builders 接着new一个new_Builder出来,在Location中填写ndk包的ndk—build.cmd,Working Directory 填写就是该项目位置;切换到Build Options然后打勾auto build即可。这样就可以自行编译,不用在修改本地方法后还要执行命令行了(即为so会自动更新)。

打印log
借用代码在工具包中的samples中native-media中的jni里的c文件:

#include <android/log.h>

#define TAG "NativeMedia"

#define LOGV(...) __android_log_print(ANDROID_LOG_VERBOSE, TAG, __VA_ARGS__)

在方法中调用LOGV(“LOG 内容”);即可打印

但是还得在Android.mk中指定一些东西
去samples的native-audio的jni里看mk,复制

# for logging
LOCAL_LDLIBS    += -llog

放入本地的mk即可。

java-》native
jni数据交换的字符串处理:
①普通字符串 //其中path是传递过来的字符串在c的native中是jstring表示。
JNIEXPORT void JNICALL
Java_com_example_hellondkk_MainActivity_updateFile(JNIEnv* env,jclass jclass,jstring path);
传过来的是字符串,在c语言中是指针指示,所以主要是调用(* env)->GetStringUTFChars(env,path,NULL);返回个const char*即为字符串。

②数组
方式1.数组拷贝
新建个数组,是用个GetIntArrayRegion的方法获得拷贝值,然后对数组数据进行操作,之后便是SetIntArrayRegion的方法将之后的数组又返回给传过来的数组,return即可。
jint nativeArray[5];
(*env)->GetIntArrayRegion(env,data,0,5,nativeArray);
int i;
for( i=0;i<5;i++){
nativeArray[i]+=5;
LOGV(“print array:%d”,nativeArray[i]);
}
(*env)->SetIntArrayRegion(env,data,0,5,nativeArray);
return data;
方式2.直接调用数组指针进行操作
调用方法获取数组指针和其长度对数据进行操作。
jint* array=(*env)->GetIntArrayElements(env,data,NULL);
jsize len=(*env)->GetArrayLength(env,data);
最后记得将对应的jint指针释放
(*env)->ReleaseIntArrayElements(env,data,array,0);

JNI的交互处理之eclipse开发工具配置
1.配置生成javah选项(即可以不用进入命令行输入,而是自动运行生成头文件)
即为配置tool,打开run->external Tools点击Program进行配置
Location中点击variables来搜索出system_path然后就可以写入

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值