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