打日志
// 需要包含的头文件
#include <android/log.h>
// .mk文件中需要导入的库
// LOCAL_LDLIBS := -llog
#define LOG_TAG "libSVGm"
#define LOGI(...) __android_log_print(ANDROID_LOG_INFO,LOG_TAG,__VA_ARGS__)
#define LOGE(...) __android_log_print(ANDROID_LOG_ERROR,LOG_TAG,__VA_ARGS__)
//打日志示例:
LOGI("Enter initPlugIn(), nSize = %d", nSize);
Load动态库及获取接口
//需包含的头文件:
#include <dlfcn.h>
// 定义句柄
void *fileHandle = NULL;
// 定义接口函数指针示例
NXCGSVGInterface* (*getSvgInterface)() = NULL;
// Load动态库示例
char *libPath = "/data/data/com.example.nxcgsvgparser/lib/libNXCGSVGParser.so";
fileHandle = dlopen(libPath, RTLD_LAZY);
if(fileHandle)
{
LOGI("Load Lib Success, %d", 0);
getSvgInterface = (NXCGSVGInterface* (*)())dlsym(fileSvgHandle, "NXCGSVG_GetInterface");
if(getSvgInterface)
{
LOGI("getSvgInterface success, %d", 0);
}
}
JNI解析Bitmap对象
// 需要包含的头文件
#include <android/bitmap.h>
// .mk文件中需要导入的库
LOCAL_LDLIBS += -ljnigraphics
/*
*inBuffer为从java层以jobject类型传过来的Bitmap
*/
AndroidBitmapInfo infoImg;
void* pixelsImg;
int ret;
//AndroidBitmap_getInfo(env, inBuffer, &infocolor);
if((ret = AndroidBitmap_getInfo(env, img, &infoImg)) < 0)
{
LOGE("AndroidBitmap_getInfo() failed ! error=%d", ret);
return;
}
LOGI("color image :: width is %d; height is %d; stride is %d; format is %d;flags is%d",
infoImg.width,infoImg.height,infoImg.stride,infoImg.format,infoImg.flags);
if ((ret = AndroidBitmap_lockPixels(env, img, &pixelsImg)) < 0)
{//【锁定AndroidBitmap_lockPixels】
//锁定之后,pixelscolor指向图片的首地址
LOGE("AndroidBitmap_lockPixels() failed ! error=%d", ret);
}
else
{
LOGI("pixels have locked, %d", 0);
}
//TPOUTLINEFIGURE* pOutLine = ((CNXCGSVG*)cgSvg)->GenerateOutline();
//((CNXCGSVG*)cgSvg)->GenerateBuffer((DWORD*)pixelsImg, nWidth, nHeight);
/*
*此处锁定之后可以对Bitmap的内存进行操作
*/
LOGI("Have GenerateBuffer(), %d", 0);
AndroidBitmap_unlockPixels(env, img);
生成JNI头文件
D:\workspace\testjni1\bin>javah -d header -classpath C:\android\android-sdk-windows\platforms\android-16\android.jar;classes -jni com.example.testjni1.MainActivity