【发布时间】:2020-11-29 21:14:45
【问题描述】:
这是我第一次在 Android 中使用本机调用,我无法获得图像处理功能的结果。我按照 NDK bitmap-plasma 示例进行操作,但我得到的位图与我发送到 C 代码的位图相同。
在 Java 中我有:
public class ImageProcessing {
private static native void processImage(Bitmap bitmap);
private static Bitmap imgBitmap;
public static Bitmap imgPrc_loadAndProcess(Uri img_uri, Context context){
imgBitmap = null;
try{
imgBitmap = BitmapUtils.getBitmapFromContentUri(context.getContentResolver(), img_uri);
processImage(imgBitmap);
return imgBitmap;
}catch (Exception e) {
System.console().printf(e.toString());
}
return null;
}
}
在 C 中:
extern JNIEXPORT void JNICALL Java_com_----_----_----_ImageProcessing_processImage(JNIEnv * env, jclass obj, jobject bitmap)
{
AndroidBitmapInfo info;
void* pixels;
int ret;
if ((ret = AndroidBitmap_getInfo(env, bitmap, &info)) < 0) {
LOGE("AndroidBitmap_getInfo() failed ! error=%d", ret);
return ;
}
if ((ret = AndroidBitmap_lockPixels(env, bitmap, &pixels)) < 0) {
LOGE("AndroidBitmap_lockPixels() failed ! error=%d", ret);
}
***ImageProcessing stuff that modifies values in *pixels* variable***
AndroidBitmap_unlockPixels(env, bitmap);
return ;
}
我检查了 C 代码确实改变了像素变量。提前致谢!
【问题讨论】:
-
, jobject bitmap您可以更改该变量,但它是调用者位图的副本。不过,您有一些选择。, jobject *bitmap。如果这不可能,让您的函数返回位图,以便您可以像imgBitmap=processImage(imgBitmap);一样调用它。
标签: java android c image-processing java-native-interface