編譯報(bào)錯(cuò)
error: undefined reference to 'AndroidBitmap_getInfo'
clang++: error: linker command failed with exit code 1 (use -v to see invocation)
ninja: build stopped: subcommand failed.
報(bào)錯(cuò)原因:
jnigraphics庫(kù)沒(méi)有動(dòng)態(tài)鏈接
解決
- Cmake編譯解決
添加動(dòng)態(tài)鏈接庫(kù) jnigraphics
target_link_libraries(
native-lib
jnigraphics
${log-lib})
- Android.mk 編譯解決
LOCAL_LDLIBS := -llog -ljnigraphics
gradle 腳本
ndk {
moduleName "webcam"
ldLibs "log"
ldLibs "jnigraphics"
}
關(guān)于jnigraphics庫(kù)
jnigraphics庫(kù)可以用來(lái)從android.bitmap.Graphics類(當(dāng)然是用Java)訪問(wèn)C / C ++中的位圖緩沖區(qū)
a) 用 AndroidBitmap_getInfo() 函數(shù)從位圖句柄(從JNI得到)獲得信息(寬度普舆、高度巩检、像素格式)
b) 用 AndroidBitmap_lockPixels() 對(duì)像素緩存上鎖,即獲得該緩存的指針孝鹊。
c) 用C/C++ 對(duì)這個(gè)緩沖區(qū)進(jìn)行讀寫
d) 用 AndroidBitmap_unlockPixels() 解鎖
使用它,在你的源代碼中包含<android/bitmap.h>
它可以用來(lái)在C / C ++中加載例如OpenGL ES的圖像,但是必須做一些工作來(lái)將一個(gè)jobject交給這個(gè)庫(kù),這樣它可以讓你直接訪問(wèn)一個(gè)緩沖區(qū)粱檀。可以通過(guò)glTexImage2D()將該緩沖區(qū)傳遞給OpenGL的漫玄。
首先梧税,需要一個(gè)Java的Bitmap對(duì)象,可以獲取這個(gè)對(duì)象并將其傳遞給本地方法称近,如下所示:
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
BitmapFactory.Options options = new BitmapFactory.Options();
options.inScaled = false;
Bitmap bitmap = BitmapFactory.decodeResource(context.getResources(), R.drawable.myimage, options);
MyJniMethod(bitmap); // Should be static in this example
該本地方法可以看起來(lái)像這樣:
#include <android/bitmap.h>
void MyJniMethod(JNIEnv *env, jobject obj, jobject bitmap)
{
AndroidBitmapInfo info;
uint32_t *pixels;
int ret;
AndroidBitmap_getInfo(env, bitmap, &info);
if(info.format != ANDROID_BITMAP_FORMAT_RGBA_8888)
{
LOGE("Bitmap format is not RGBA_8888!");
return false;
}
AndroidBitmap_lockPixels(env, bitmap, reinterpret_cast<void **>(&pixels)); // Now you can use the pixel array 'pixels', which is in RGBA format
}
當(dāng)完成像素緩沖區(qū)時(shí),應(yīng)該調(diào)用AndroidBitmap_unlockPixels() 哮塞,并且此示例根本不檢查錯(cuò)誤刨秆。
確保輸出圖像格式是你期望的,通過(guò)添加到上面的選項(xiàng):
options.inPreferredConfig = Bitmap.Config.ARGB_8888;
有一種情況是輸出圖像在JNI中仍然以未知格式結(jié)束忆畅。 只發(fā)生在GIF上衡未。 調(diào)用BitmapFactory.decodeResource() ,如果需要家凯,可以將圖像轉(zhuǎn)換為適當(dāng)?shù)母袷剑?/p>
if (bitmap.getConfig() != Bitmap.Config.ARGB_8888) {
Bitmap reformatted_bitmap = bitmap.copy(Bitmap.Config.ARGB_8888, false);
bitmap.recycle();
/* reduce memory load in app w/o waiting for GC */
bitmap = reformatted_bitmap;
}