android开发过程中用jni封装了一个灰度图算法,调用后运行时程序崩溃 10C

这是jni的.cpp文件
#include
#include
#include
#include

JNIEXPORT jintArray JNICALL Java_com_example_imagetogray_LibFuns_ImgToGray(
JNIEnv* env, jobject obj, jintArray buf, int w, int h) {
jint *cbuf;
cbuf = env->GetIntArrayElements(buf,0);
if (cbuf == NULL) {
return 0;
}

int alpha = 0xFF; // 不透明值
int i, j, color, red, green, blue;
for (i = 0; i < h; i++) {
    for (j = 0; j < w; j++) {
            color = cbuf[w * i + j]; // 获得color值
            red = (color >> 16) & 0xFF; // 获得red值
            green = (color >> 8) & 0xFF; // 获得green值
            blue = color & 0xFF; // 获得blue值
            color = (red * 38 + green * 75 + blue * 15) >> 7; // 灰度算法(16位运算下7位精度)
            color = (alpha << 24) | (color << 16) | (color << 8) | color; // 由ARGB组成新的color值
            cbuf[w * i + j] = color; // 设置新color值
        }
   }

int size=w * h;
jintArray result = env->NewIntArray(size);
env->SetIntArrayRegion(result, 0, size, cbuf);
env->ReleaseIntArrayElements(buf, cbuf, 0);
return result;

}

这是调用过程:
class ClickEvent implements View.OnClickListener{
@Override
public void onClick(View v) {
if(v==btnJAVA)//采用的是java库类直接实现灰度图
{
Bitmap img=ConvertGrayImg(ImagePath);//ImagePath是sd卡图片路径
imgView.setImageBitmap(img);
}
else if(v==btnNDK)
{
Bitmap img1=BitmapFactory.decodeFile(ImagePath);
int w=img1.getWidth(),h=img1.getHeight();
int[] pix = new int[w * h];
img1.getPixels(pix, 0, w, 0, 0, w, h);//通过getPixels获取Bimap中的图片数据
int[] resultInt=LibFuns.ImgToGray(pix, w, h);//调用so中的灰度图处理方法
Bitmap resultImg=Bitmap.createBitmap(w, h, Config.RGB_565);
resultImg.setPixels(resultInt, 0, w, 0, 0,w, h);
imgView.setImageBitmap(resultImg);

}
}
}

请大神指点!!!!
1

4个回答

0

JNIEXPORT jintArray JNICALL Java_com_example_imagetogray_LibFuns_ImgToGray(
JNIEnv* env, jobject obj, jintArray buf, int w, int h) {
jint *cbuf;
cbuf = env->GetIntArrayElements(buf,0);
if (cbuf == NULL) {
return 0;
}

如果cbuf不为空呢,你返回什么,没有return,肯定报错

0

建议你发一下调试日志

-1

既没来见你加载so库的代码,又没看见你本地方法,还不知道你的错误日志

-1
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
Jni C/C++运行时遇到异常怎么办?捕获与抛出
有个头疼的问题,Jni C/C++遇到问题闪退怎么办?有办法,我们可以在异常发生后通过判断清除异常解决,保持程序及时反应处理。 比如: package crash; import java.security.NoSuchAlgorithmException; public class DogUtils { // Used to load the 'native-lib' libra
Andorid之jni里面崩溃然后用errno分析结果解决问题
1、问题 在jni里面程序崩溃了,初步定位是这行代码,下面的结果运行既然小于0,我觉得很奇怪,理论上不应该啊,想不到为什么会小于0 if ((sock_fd = socket(PF_INET, SOCK_STREAM, 0)) 2、解决办法 在文件里面加上#include头文件,既然这里出错了,就用errno,然后在这个崩溃地方打印出这个 errno的
Android Jni OpenCV图片灰度处理
一,java代码,收集Bitmap 信息 public class MainActivity extends AppCompatActivity implements View.OnClickListener {private Button btnProc; private ImageView imageView; private Bitmap bmp;// Used to load the 'n
ios-滑块验证码.zip
项目中用到了这种滑块验证码,封装了一个
android studio 实现类似百度地图 发布SDK机制实现(jni实现调用C++的so库,并封装jar包)
本文主要是Android JNI编程相关,包括java接口打包jar包,c++编译so库,通过jni调用。并在一个全新的android项目中测试使用我们自己发布的sdk的整套流程。 写这篇文章的主要目的是,网上好像并没有这么一整套的机制实现参考。 android studio 类似百度地图 发布SDK机制实现(jni实现调用C++的so库,并封装jar包)
android jni中的java调c的两种方法
终于有个时间来整理以前的一些笔记,android最大的特点就是native/art虚拟机,因此就有了NDK编程和SDK编程的区别 NDK是使用了本地接口(c /c++)jni,sdk则是java层的接口;因此读懂和了解jni是关键
JNI调用出现XXX遇到问题已退出解决方法
在JNI调用中经常会遇到异常导致APK闪退的现象,而这种问题通常很难定位,要定位这种问题,需要: 1:首先在logcat中加入debug(方法如图所示): 2:在运行后报错中会在debug中找到类似这样的一串错误 看到这个长长的错误,不要慌,我们就要拿着这个错误去分析: 首先,从这个长长的串中找到有用的信息 10-28 12:39:17.779: I/DE
Android 平台的Python——JNI方案(二)
关于在Android项目中嵌入解释器,实现Java与Python相互调用,以有好的项目提供了思路,地址:https://github.com/joaoventura/pybridge我这里说一下简单实现1、环境准备配置好crystax ndk环境,并创建一个NDK项目,将crystax 包下面的 libpython3.5m.so拷贝至工程 lib/armeabi目录下2、编写为Java 编写 nat
JNI与C/C++的调用与封装(Demo应用)
  项目中使用JNI的地方,如:核心逻辑,密钥,加密逻辑。JNI还有很多的应用,比如FFMPEG,OpenGL等。 JNI常见的场景如:加解密算法,音视频编解码等。 -- 使用JNI,复用很多优秀的c/c++代码:ffmpeg 多媒体播放器;opencv 图形识别引擎;7-zip 压缩;opencore 视频播放   C/C++实现的算法,JNI封装(SO文件,动态链接文件),Java、An...
JNI开发(一) 简单的C代码打包成SO库以及项目如何调用SO库
前段时间开发过程中用到了简单的JNI使用,当时发现很多网上文章总有这样那样的问题,最近趁时间充裕就记录下来,以供记忆和交流。JNI环境配置这里就不做多讲,百度一下,把脚跨过墙就好。写一个简单的SO库先在项目中创建一个类,里面暴露出本地代码的接口。随后使用Terminal 执行生成.h的命令,将目录先定位到java目录,再执行 javah -jni com.monke.simplejnidemo.S
dll调用后程序崩溃 0xc0000005
程序本身是dll,又调用了个发送sms的dllrn结果在SMSA这个函数调用返回时,出错,0xc0000005rnrnrn调用约定都是__cdeclrnrn参数全部是CString& rnrndebug 和 release 都出错了,内存错误,都不知道怎么去调试,求助啊啊啊啊啊啊rnrn[code=C/C++]void SMSA()//调用发送sms的动态链接库[/code]rnrnrncall stackrnrn调用前:rnFile_Manger::SMSAlert(char * 0x101399f4, char * 0x00000000) line 7676rnCManager::CManager(CDatabase * 0x1014cf40, CDatabase * 0x1014cf40, char * 0x003b1224, char * 0x003b122a) line 331rnCiastkup::ManagerProcess(char * 0x003b1224, char * 0x003b122a) line 302 + 55 bytesrnDO_WORK(char * 0x0012eddc, char * 0x003b120d, char * 0x0012ef80, char * 0x003b121c, char * 0x003b121c, char * 0x003b1224, char * 0x003b122a, HWND__ * 0x00000000, int 1, long 8, int 5) line 181 + 18 bytesrnDOWORK! 0040226f()rn003b120d()rn5c6b7361()rnrn调用后:rnFile_Manger::SMSAlert(char * 0x101399f4, char * 0x00000000) line 7651rnCManager::CManager(CDatabase * 0x1014cf40, CDatabase * 0x1014cf40, char * 0x003b1224, char * 0x003b122a) line 331rnCiastkup::ManagerProcess(char * 0x003b1224, char * 0x003b122a) line 302 + 55 bytesrnDO_WORK(char * 0x0012eddc, char * 0x003b120d, char * 0x0012ef80, char * 0x003b121c, char * 0x003b121c, char * 0x003b1224, char * 0x003b122a, HWND__ * 0x00000000, int 1, long 8, int 5) line 181 + 18 bytesrnDOWORK! 0040226f()rn003b120d()rn5c6b7361()
Android Jni OpenCV-灰度图像的直方图
一,java代码,收集Bitmap 信息public class MainActivity extends AppCompatActivity implements View.OnClickListener {private Button btnProc; private ImageView imageView; private Bitmap bmp;// Used to load the 'nat
Android——JNI项目使用Cmake打包生成.so库和jar包
         最近项目中需要将当前开发的JNI项目封装成SDK的形式供第三方app调用,而且我当前项目还引用了外部静态库。大家都知道java的代码可以以Module的形式打包成jar包,而jni中C或C++的代码可以输出so动态库,那么这俩如何结合起来也是个问题。看了很多文章,因为了解不多,以为这个是很复杂的事情,自己研究了一下才发现还是挺简单的。         一、首先项目是要把项目转换为...
树莓派基于wiringPi库, 编写JNI本地动态库供Java调用
RaspberryPi 基于wiringPi库, 编写JNI本地动态库供Java调用(demo)本文关键字: RaspberryPI Java JNI wiringPi库 什么是JNI JNI是Java Native Interface的缩写,它提供了若干的API实现了Java和其他语言的通信(主要是C&C++)。 —— [ WiKi ] 在这之前, RaspberryPi已经提供了Pi
android jni校验当前签名和打包时的签名是否一直
网上找了很多资料,都不可用,这是采了很多坑才做出来的.不会c++,所以写的代码很蹩脚,介意的别下.
Android平台下使用OpenCV灰度化图片的两种方式
在OpenCV中灰度化图像是比较常用的操作之一,这篇文章介绍了两种方法对图像进行灰度化并显示出来。
Android中有没有办法通过jni在Linux内核获取摄像头yuv数据??
本人移植了ffmpeg库在Android上,但是在对视频编码的时候是通过java层camera接口获取yuv数据的,然后传给jni处理。但这效果很差,而且这个获取yuv的接口还不是纯正的yuv采集,采用回调这样的方式采集。现在就有个问题如何通过jni获取摄像头的yuv数据,当然,我看了V4l2,但是手机里面没有video0这个摄像头映像文件。求大神支个招。。
在eclipse下,JAVA通过JNI调用C++方法的简单例子(非android)
eclipse Java JNI VS2015 开发
使用JNI 调用第三方c++动态库
昨天晚上到今天一直在折腾这个第三方库文件,唉,要哭了,一直就是各种问题。现在详细说说怎么做,踩过哪些坑。
Android程序崩溃,如何根据崩溃的日志信息定位出崩溃的行数
在编译Android底层的jni程序时,有两种编译方式:ndk和cmake,现在针对两种不同的编译方式来定位出崩溃的具体行号 ndk: 1、找到你的项目工程里的jni生成的目录,比如说目录为:obj/armeabi/objs/ 2、拿到崩溃的地址,例如:0xabcb1c3d 3、假如说日志崩溃到libgguardian.so库里了,在命令行里执行 arm-linux-androideabi-add...
.so的封装调用
.so的创建和调用有一个特点,我们要知道.so的调用并不一定必须在Activity中进行,那么制作时也并不一定要在Activity中,但是,一旦.so制作成功,那么再调用时,调用的java类就必须跟制作.so时的java类(包括路径和类名)必须一致!   举个例子:拿上篇文章来说,我在创建.so时是在MainActivity中调用的,路径名是com.byl.jnitest,那么最终生成的.so想
NDK实现后台服务保活
现在的国产手机基本都是不能保证的 随随便便一杀就没了 复活不了;我的华为P9就不行,其他的我觉得也够呛,但是使用公司自己得MTK5.0平台, 那真是特吗和病毒没什么区别。。。 我这是在腾讯课堂里学习来得;动脑学院,挺好得一个学习android看视频得地方; 1: java方式守护 AndroidMainfast.xml 中定义process = “:remote”字段; 手机厂商...
JNI基础(六)C调java代码
java如何调用C代码,大概已经了解了,通过是先本地方法来调用。那么C代码如何代用java代码 套路与思路:通过反射 java代码: public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) {
Android Studio里把YUV图片的byte[]从JAVA传到C++层转为mat
通过JNI把byte[]传到cpp中格式为jbyteArray //image是jbyteArray格式的 jbyte* imgBytes = env-&amp;gt;GetByteArrayElements(image, 0); int imgsize = env-&amp;gt;GetArrayLength(image); jbyte再传到cpp中变为void,再memcpy到unsi...
通过jni实现图像处理的demo-Android Studio
通过jni实现图像处理的demo-Android Studio版本 可以对照Eclipse版本:http://download.csdn.net/detail/lintax/9565857
Android Studio NDK开发 正确调用jni 及加入第三方so库需要注意的问题
Android Studio NDK开发 正确调用jni 及加入第三方so库需要注意的问题 首次使用Android Studio进行NDK开发会遇到很多问题, 我在此将自己的经验分享给大家 直接上配置比较直观 下面是在项目 app源根文件夹下build.gradle文件的配置, 都写明了注释 android { compileSdkVersion 23
[问题解决]c++通过jni调用java封装rocketmq异常、core、crash
问题背景 由于需求需要,需要使用rocketmq接收消息;到目前为止rocketmq虽然有提供c++访问rocketmq消息队列(githup工程代码路径:c++调用rocketmq),但是根据githup工程中提供的文档说明其在多个进程同时消费同一个消息队列是会存在消息重复的情况(GitHub文档路径,附上文档中说明会重复的截图:) 这是我业务上不允许出现的情况,所以目前通过c++访问...
使用jni实现在C语言中调用Java的方法
在前面的博客中介绍了jni的使用以及使用jni实现在java中调用c语言的方法,这篇博客将介绍在c语言中调用java方法 在写代码前,先看一下实现的效果 实现方式(部分步骤有所省略,详细的步骤可以参考我前面的博客) 第一步:使用eclipse创建一个Android工程,并且修改activity_main.xml文件中的代码 <LinearLayout xmlns:andro
Android Studio——配置OpenCV的方法及灰度化demo范例
Android Studio——配置OpenCV的方法及demo范例 前言:本人最近半年在做一个有关机器视觉的机器人项目,是用的安卓平台开发的,对android studio也是一个刚入门的客人,在这半年里也是全靠自学才变得熟练许多,为了大家少走些弯路才打算做这个文章。 准备工作 第一步:下载并安装Android Studio,这个可以自己去Android Studio 中文社区
基于opencv 的模板匹配类
基于opencv封装了一个模板匹配类,可以二值化匹配、灰度匹配。有说明书,起个借鉴作用,交流
关于finish()调用后Activity的生命周期问题
这个Activity onStop()里写的是防止切入后台的代码 onTouchEvent()中写的是当用户点击屏幕时会自动销毁。 可是为毛我实测的时候点击一下屏幕,程序销毁,过了一小会儿程序就又自动启动了。 应该是回调了onStop()方法。finish()不是直接调用onDestroy吗?到底finish()后Activity经历了哪些生命周期啊? package com.exam
Android JNI之Java和C互相调用
概述JNI是什么JNI是Java Native Interface的缩写,它提供了若干的API实现了Java和其他语言的通信(主要是C&C++)。从Java1.1开始,JNI标准成为java平台的一部分,它允许Java代码和其他语言写的代码进行交互。NDK是什么NDK是Native Development Kit的缩写。是SDK(software development kit)软件开发工具包的一部
【我的Android进阶之旅】Android调用JNI出错 java.lang.UnsatisfiedLinkError: No implementation found for的解决方法...
错误描述 今天使用第三方的so库时候,调用JNI方法时出现了错误。报错如下所示: 11-01 16:39:20.979 4669-4669/com.netease.xtc.cloudmusic E/art: No implementation found for void com.netease.xtc.c...
jni中的NewStringUTF这个函数调用后需要释放内存吗?
今天开发中遇到一个需求:java调用.so或dll动态库里的方法后需要返回一个字符串给java使用,如以下方式: JNIEXPORT jstring JNICALL Java_com_ygc_demo_jni_ApiNative_fromCharToJString(JNIEnv *, jclass); 请注意了这里返回的是一个jstring,那我们怎么返回这个java想要的string呢?这...
通过JNI调用第三方动态库(生成两个.so文件)
参考网上一些资料,实现了通过JNI调用第三方动态库.so,个人觉得重点在Make文件改写,例外注意确保程序完全正确,我开始就是程序中个字母写错而浪费了好多时间。
Android NDK 使用JNI调用java代码,通用代码封装
本文主要介绍一下内容: 配合NDK NativeActivity封装jni调用需要的环境参数获取静态和非静态java方法信息的封装调用静态和非静态java方法的封装获取apk签名的jni调用封装 首先,我们需要获取,jni最重要的环境对象。 #include #include extern ANativeActivity* nativeActivity; static inl
AndroidStudio jni开发入门及打包so库和jar包
AndroidStudio jni开发入门及打包so库和jar包 配置ndk开发环境 下载NDK,LLDB,CMake工具包 配置系统环境变量 在原有项目中进行jni开发环境配置 Androidstudio2.0之后新建的项目可直接生成cpp项目,所有详细说下在原有项目中进行jni开发环境配置: 在src/main文件夹下建一个cpp文件夹(这里存放jni代码) 在app文件夹下建一个...
Java Jni调用并编写dll详细教程
Java Jni调用并编写dll详细教程   JNA虽然可以直接调用Windows标准DLL,但是不支持64位DLL,如今使用64位JDK的机器越来越多,JNA反而成了鸡肋。   使用JNI,需要为C\C++生成JAVA调用约定头文件,并对标准windows DLL源码进行适当修改。以下以一个简单的例子演示整个过程。环境:win7 64位操作系统,JDK1.7 64位,vs2010(安装...
ImageSamples
通过封装了GDI下的Bitmap与WPF下的Image的转换接口 在WPF下实现了对图片的灰度处理
Android下新增JNI过程中启动新增系统服务(addService)遇安全错误问题
Android下新增JNI过程中addService遇安全错误问题     今天新增一个JNI的时候遇到一个调用用addService的时候发生异常的问题: 首先是在SystemService.java添加一个自己定义的binder service,代码如下: try { Slog.i(TAG, "Xxx Service"); ServiceManager