Android自助餐之Jni(五)进阶
2016-05-23 16:29
375 查看
Android自助餐之Jni(五)进阶
Android自助餐之Jni五进阶Android自助餐专栏
Android自助餐之Jni一最简单的运行
Android自助餐之Jni二静态导入so文件
Android自助餐之Jni三动态导入so文件
Android自助餐之Jni四在线导入so文件
Android自助餐之Jni五进阶
Android自助餐之Jni六NDK入门
C2C待完善
函数声明
方法调用
使用androidLog
模块化
类型转换
操作bitmap
其他
Android自助餐专栏
Android自助餐之Jni(一)最简单的运行
Android自助餐之Jni(二)静态导入so文件
Android自助餐之Jni(三)动态导入so文件
Android自助餐之Jni(四)在线导入so文件
Android自助餐之Jni(五)进阶
Android自助餐之Jni(六)NDK入门
C2C++(待完善)
函数声明
Java类:package.name.ClassName.methodName();Java方法:
public native String methodName(String value)
C:
JNIEXPORT jstring JNICALL Java_package_name_ClassName_methodName(JNIEnv *env,jobject obj,jstring value)
C++
//声明 extern "C"{ jstring Java_package_name_ClassName_methodName(JNIEnv *env,jobject obj,jstring value); } //定义: jstring Java_package_name_ClassName_methodName(JNIEnv *env,jobject obj,jstring value){...}
方法调用
GetStringUTFCharsC:
char * str = (*env)->GetStringUTFChars(env,value,NULL);
C++:
const char * str = env->GetStringUTFChars(value,NULL);
NewStringUTF
C:
(*env)->NewStringUTF(env, str);
C++:
env->NewStringUTF(str);
sprintf
C:使用前只需定义第一个参数
char * str;
C++:使用前需定义第一个参数并为其分配空间
char * str = (char*)malloc(sizeof("size you need"))
使用androidLog
配置build.gradle
android { //... defaultConfig { //... ndk{ //... ldLibs "log", "z", "m" } } }
include
在用到log的C/C++中
#include <android/log.h>
调用log
__android_log_write(ANDROID_LOG_ERROR, "tag","message");
模块化
当jni文件夹下文件过多不好管理时,可以再jni下新建子文件夹来将文件分模块管理,引用时写上子文件名即可。例文件jni/file.h移到
jni/file/file.h,对应的
include "file.h"改为
include "file/file.h"。
类型转换
java中的String在C/C++中用jstring接收,用char*操作,jstring与char*的转换见上述(C2C++)
java中的int
在C++中用int接收。
操作bitmap
java代码public native void fun(Bitmap bmp);
C++头文件
#include <android/bitmap.h>
C++代码
void Java_package_name_ClassName_fun(JNIEnv *env,jobject obj,jobject bmp){ AndroidBitmapInfo bmpInfo={0}; if(AndroidBitmap_getInfo(env,bmp,&bmpInfo)<0){return;} unsigned char * dataFromBmp=NULL;//此指针即指向bitmap数据的指针 if(AndroidBitmap_lockPixels(env,bmp,(void **)&dataFromBmp)){return;}//获取并锁定bitmap在内存的地址 //do something with dataFromBmp AndroidBitmap_unlockPixels(env,bmp);//操作结束后需要解锁改地址 }
配置build.gradle
android { //... defaultConfig { //... ndk{ //... ldLibs "jnigraphics" } } }
配置Android.mk
LOCAL_LDLIBS := -ljnigraphics
clean project
其他
使用标准库STL在jni下新建文件
Application.mk并写入
APP_STL := stlport_static
在build.gradle中配置
android { //... defaultConfig { //... ndk{ //... stl "stlport_static" } } }
开启异常控制(可以在cpp中throw)
android { //... defaultConfig { //... ndk{ //... cFlags = "-fexceptions" } } }
error: undefined reference to xxx
一般该错误会在cpp中报出,找到对应的h文件,做如下修改
#ifndef _A_H #define _A_H #ifdef __cplusplus extern "C"{ #endif ...(文件原有代码) #ifdef __cplusplus } #endif #endif // endof _A_H
const char *转
unsignde char *
//const cahr * str=...; unsigned char * data=(unsigned char *)(const_cast<char*>(str));
相关文章推荐
- android 笔记之代码混淆
- Android性能优化
- android 控件 getBackground().setAlpha设置透明值,影响其他页面样式问题
- 在Android M及更高版本中使用 Settings.System 抛出异常"You cannot keep your settings in the secure settings. "
- Android自助餐之XML
- android 启动界面
- android 使用Bitmap压缩图片
- Android自助餐之adb使用场景
- Android自定义HorizontalScrollView打造超强Gallery效果
- 设计模式在Android源码的运用
- 对话框
- Android 中查看内存的使用情况集常用adb命令
- Android图片下载机制
- Android媒体库更新问题
- Android如何高效显示较大的Bitmaps
- android打包签名介绍
- 你需要知道的Android拍照适配方案
- Android Studio教程 简介与入门(资料比较旧,但有一定参考价值)
- Android统计APK方法数
- RxJava在Android中内存泄漏解决以及RxJava的封装