Android Studio JNI (图像变灰过程)使用cmake (1)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/lvzhongdi/article/details/83964406

Android Studio JNI (图像变灰过程)使用cmake (1)
1.开始创建第一个AS 工程;
创建工程
2.选择完毕后下一步
在这里插入图片描述
3.再下一步后直接点击完成,然后我们开始运行一下,即可看到Hello from JNI
在这里插入图片描述
4.下面我们看下CMakeLists.txt文件

CMakeLists详情
 cmake_minimum_required(VERSION 3.4.1)

**#设置cmakelist的目标路径``**

set(distribution_DIR ${CMAKE_SOURCE_DIR}/../../../../distribution)
#增加Cpp动态共享库
add_library( native-lib
             SHARED
             native-lib.cpp )

#增加so文件动态共享库,${ANDROID_ABI}表示so文件的ABI类型的路径
add_library(wzh033 SHARED IMPORTED)
set_target_properties(wzh033  PROPERTIES IMPORTED_LOCATION
${distribution_DIR}/plus/lib/${ANDROID_ABI}/libwzh033.so)


set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=gnu++11")
#增加include包含的路径
target_include_directories(native-lib PRIVATE
               ${distribution_DIR}/plus/include)
#生成链接动态库
target_link_libraries(    native-lib
                            wzh033
                            android
                          ${log-lib} )
de>

5.下面看下Gradle的配置(重点是红色线的部分)
在这里插入图片描述
6.下面开始我们的主题内容,图像变成灰色;
首先找到个图片,然后写一下界面布局,我的代码如下;

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center_horizontal"
    android:orientation="vertical"
    tools:context=".MainActivity">

    <TextView
        android:id="@+id/sample_text"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello World!"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <ImageView
        android:id="@+id/imageview"
        android:layout_width="200dp"
        android:layout_height="150dp"
        android:src="@drawable/girl"
        android:scaleType="fitCenter" />


    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:onClick="onTurn"
        android:text="一键美化" />

</LinearLayout>

7.看下MainActivity的界面代码

public class MainActivity extends AppCompatActivity {

    private ImageView iv;
    private TextView tv;

    // Used to load the 'native-lib' library on application startup.
    static {
        System.loadLibrary("native-lib");
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initView();
        initDatas();
    }

    private void initDatas() {
        tv.setText(stringFromJNI());
    }

    private void initView() {
        tv = findViewById(R.id.sample_text);
        iv = findViewById(R.id.imageview);

    }

    /**
     * A native method that is implemented by the 'native-lib' native library,
     * which is packaged with this application.
     */
    public native String stringFromJNI();

    public native int[] getImgToGray(int[] data, int w, int h);
	/**
	*使用JNI 来改变图片的RGB 颜色
	*
	*/
    public Bitmap getJniBitmap() {
        Bitmap bitmap = ((BitmapDrawable) getResources().getDrawable(R.drawable.girl)).getBitmap();
        int w = bitmap.getWidth(), h = bitmap.getHeight();
        int[] pix = new int[w * h];
        bitmap.getPixels(pix, 0, w, 0, 0, w, h);
        //使用JNI
        int[] resultInt = getImgToGray(pix, w, h);
        Bitmap resultImg = Bitmap.createBitmap(w, h, Bitmap.Config.RGB_565);
        resultImg.setPixels(resultInt, 0, w, 0, 0, w, h);
        return resultImg;
    }

    /**
     * 变灰色
     *
     * @param view
     */
    public void onTurn(View view) {
        iv.setImageBitmap(getJniBitmap());
    }
}

8.接下来看看c文件

#include <jni.h>
#include <string>

extern "C" JNIEXPORT jstring

JNICALL
Java_com_lv_ndk_MainActivity_stringFromJNI(
        JNIEnv *env,
        jobject /* this */) {
    std::string hello = "Hello from C++";
    return env->NewStringUTF(hello.c_str());
}
extern "C"
JNIEXPORT jintArray JNICALL
Java_com_lv_ndk_MainActivity_getImgToGray(JNIEnv *env, jobject instance, jintArray data_, jint w,
                                          jint h) {
    jint *data = env->GetIntArrayElements(data_, NULL);

    // TODO
    if (data == NULL) {
        return 0; /* exception occurred */
    }
    int alpha = 0xFF << 24;
    for (int i = 0; i < h; i++) {
        for (int j = 0; j < w; j++) {
            // 获得像素的颜色
            int color = data[w * i + j];
            int red = ((color & 0x00FF0000) >> 16);
            int green = ((color & 0x0000FF00) >> 8);
            int blue = color & 0x000000FF;

            color = (red + green + blue) / 3;

            color = alpha | (color << 16) | (color << 8) | color;

            data[w * i + j] = color;
        }
    }

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

这里面包含了我们创建项目中自带的一个字符串的返回 方法(stringFromJNI),我喜欢留着他,这样可以看看是不是jni不好用了,哈哈哈
9.接下来,我们就可以运行项目实现如下效果:
在这里插入图片描述
10.项目代码上传到GitHub上
https://github.com/softwareboy92/AS_JNI_ImageGray/tree/master

猜你喜欢

转载自blog.csdn.net/lvzhongdi/article/details/83964406