Android Studio JNI (影象變灰過程)使用cmake (1)
阿新 • • 發佈:2018-11-19
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