您的位置:首页 > 移动开发 > Android开发

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){...}


方法调用

GetStringUTFChars

C:
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));
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: