android JNI 報錯:error: undefined reference to 'AndroidBitmap_getInfo'

編譯報錯

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.

報錯原因:
jnigraphics庫沒有動態鏈接

解決

  • Cmake編譯解決
    添加動態鏈接庫 jnigraphics
target_link_libraries(
       native-lib
       jnigraphics
       ${log-lib})
  • Android.mk 編譯解決
LOCAL_LDLIBS    := -llog -ljnigraphics

gradle 腳本

ndk {
        moduleName "webcam"
        ldLibs "log"
        ldLibs "jnigraphics"
    }

關于jnigraphics庫

jnigraphics庫可以用來從android.bitmap.Graphics類(當然是用Java)訪問C / C ++中的位圖緩沖區

a) 用 AndroidBitmap_getInfo() 函數從位圖句柄(從JNI得到)獲得信息(寬度、高度、像素格式)
b) 用 AndroidBitmap_lockPixels() 對像素緩存上鎖,即獲得該緩存的指針。
c) 用C/C++ 對這個緩沖區進行讀寫
d) 用 AndroidBitmap_unlockPixels() 解鎖

使用它,在你的源代碼中包含<android/bitmap.h>

image.png

它可以用來在C / C ++中加載例如OpenGL ES的圖像,但是必須做一些工作來將一個jobject交給這個庫,這樣它可以讓你直接訪問一個緩沖區。可以通過glTexImage2D()將該緩沖區傳遞給OpenGL的。

首先,需要一個Java的Bitmap對象,可以獲取這個對象并將其傳遞給本地方法,如下所示:

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 

該本地方法可以看起來像這樣:

#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 

} 

當完成像素緩沖區時,應該調用AndroidBitmap_unlockPixels() ,并且此示例根本不檢查錯誤。

確保輸出圖像格式是你期望的,通過添加到上面的選項:

options.inPreferredConfig = Bitmap.Config.ARGB_8888;

有一種情況是輸出圖像在JNI中仍然以未知格式結束。 只發生在GIF上。 調用BitmapFactory.decodeResource() ,如果需要,可以將圖像轉換為適當的格式:

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;

 } 
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • Swift1> Swift和OC的區別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴謹 對...
    cosWriter閱讀 11,135評論 1 32
  • 編譯工具 CMake 在Android Studio 2.2 之后,工具中增加了 CMake 的支持,于是我們有兩...
    揚州慢_閱讀 4,756評論 0 2
  • OpenGL(Open Graphics Library):圖形硬件的軟件接口,將計算機的資源抽象成一個OpenG...
    LanceLjm閱讀 2,212評論 1 7
  • 卷首語 歡迎來到 objc.io 的第三期! 這一期都是關于視圖層的。當然視圖層有很多方面,我們需要把它們縮小到幾...
    評評分分閱讀 1,796評論 0 18
  • 一 閱讀中遇到的疑惑 1.曾經有些閱讀者提過這樣的問題:有些書看過就忘了,記不得書中的內容,當別人提起來的時候,只...
    Bookclub閱讀 206評論 0 2