说明示例代码显示了如何存储2个不同的位图(较小的位图,但这只是一个演示),回收原始的Java位图,然后将它们还原为Java实例并使用它们。
您可能会猜到,该布局有2个imageViews。我没有在代码中包含它,因为它很明显。
请记住,如果需要,可以将代码更改为您自己的软件包,否则将无法正常工作。
MainActivity.java-如何使用:
package com.example.jnibitmapstoragetest;...public class MainActivity extends Activity { @Override protected void onCreate(final Bundle savedInstanceState) { super.onCreate(savedInstanceState); // Bitmap bitmap=BitmapFactory.depreResource(getResources(),R.drawable.ic_launcher); final JniBitmapHolder bitmapHolder=new JniBitmapHolder(bitmap); bitmap.recycle(); // Bitmap bitmap2=BitmapFactory.depreResource(getResources(),android.R.drawable.sym_action_call); final JniBitmapHolder bitmapHolder2=new JniBitmapHolder(bitmap2); bitmap2.recycle(); // setContentView(R.layout.activity_main); { bitmap=bitmapHolder.getBitmapAndFree(); final ImageView imageView=(ImageView)findViewById(R.id.imageView1); imageView.setImageBitmap(bitmap); } { bitmap2=bitmapHolder2.getBitmapAndFree(); final ImageView imageView=(ImageView)findViewById(R.id.imageView2); imageView.setImageBitmap(bitmap2); } } }JniBitmapHolder.java-JNI和JAVA之间的“桥梁”:
package com.example.jnibitmapstoragetest;...public class JniBitmapHolder { ByteBuffer _handler =null; static { System.loadLibrary("JniBitmapStorageTest"); } private native ByteBuffer jniStoreBitmapData(Bitmap bitmap); private native Bitmap jniGetBitmapFromStoredBitmapData(ByteBuffer handler); private native void jniFreeBitmapData(ByteBuffer handler); public JniBitmapHolder() {} public JniBitmapHolder(final Bitmap bitmap) { storeBitmap(bitmap); } public void storeBitmap(final Bitmap bitmap) { if(_handler!=null) freeBitmap(); _handler=jniStoreBitmapData(bitmap); } public Bitmap getBitmap() { if(_handler==null) return null; return jniGetBitmapFromStoredBitmapData(_handler); } public Bitmap getBitmapAndFree() { final Bitmap bitmap=getBitmap(); freeBitmap(); return bitmap; } public void freeBitmap() { if(_handler==null) return; jniFreeBitmapData(_handler); _handler=null; } @Override protected void finalize() throws Throwable { super.finalize(); if(_handler==null) return; Log.w("DEBUG","JNI bitmap wasn't freed nicely.please rememeber to free the bitmap as soon as you can"); freeBitmap(); } }Android.mk-JNI的属性文件:
LOCAL_PATH := $(call my-dir)include $(CLEAR_VARS)LOCAL_MODULE := JniBitmapStorageTestLOCAL_SRC_FILES := JniBitmapStorageTest.cppLOCAL_LDLIBS := -llogLOCAL_LDFLAGS += -ljnigraphicsinclude $(BUILD_SHARED_LIBRARY)APP_OPTIM := debugLOCAL_CFLAGS := -g
JniBitmapStorageTest.cpp-“神奇”的东西在这里:
#include <jni.h>#include <jni.h>#include <android/log.h>#include <stdio.h>#include <android/bitmap.h>#include <cstring>#include <unistd.h>#define LOG_TAG "DEBUG"#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG,LOG_TAG,__VA_ARGS__)#define LOGE(...) __android_log_print(ANDROID_LOG_ERROR,LOG_TAG,__VA_ARGS__)extern "C" { JNIEXPORT jobject JNICALL Java_com_example_jnibitmapstoragetest_JniBitmapHolder_jniStoreBitmapData(JNIEnv * env, jobject obj, jobject bitmap); JNIEXPORT jobject JNICALL Java_com_example_jnibitmapstoragetest_JniBitmapHolder_jniGetBitmapFromStoredBitmapData(JNIEnv * env, jobject obj, jobject handle); JNIEXPORT void JNICALL Java_com_example_jnibitmapstoragetest_JniBitmapHolder_jniFreeBitmapData(JNIEnv * env, jobject obj, jobject handle); }class JniBitmap { public: uint32_t* _storedBitmapPixels; AndroidBitmapInfo _bitmapInfo; JniBitmap() { _storedBitmapPixels = NULL; } };JNIEXPORT void JNICALL Java_com_example_jnibitmapstoragetest_JniBitmapHolder_jniFreeBitmapData(JNIEnv * env, jobject obj, jobject handle) { JniBitmap* jniBitmap = (JniBitmap*) env->GetDirectBufferAddress(handle); if (jniBitmap->_storedBitmapPixels == NULL)


