本文共 2914 字,大约阅读时间需要 9 分钟。
public native String sayHello();
1.改成中文如下:
JNIEXPORT jstring JNICALL Java_com_atguigu_jnidemo_MainActivity_sayHello
(JNIEnv * env, jobject obj){
// jstring (*NewStringUTF)(JNIEnv*, const char*);
return (*env)->NewStringUTF(env,"你好!!");
}
运行崩溃如图日志
3.解决方案,把文件编码改成UTF-8
1.改c代码后缀名为.cpp和android.mk里面也该
2.讲解C语言中的env和C++语言中的用法
/**
* 返回字符串给Java代码
* JNIEnv* env在C语言中是:JNINativeInterface** ;如何调用结构体方法(**env).等价于(*env)->
*
* JNIEnv* env在C++语言中是: _JNIEnv*相当于JNINativeInterface*
* 取值:相当于去JNINativeInterface结构体的方法:(*env).相当于env->
*/
JNIEXPORT jstring JNICALL Java_com_atguigu_jnidemo_MainActivity_sayHello
(JNIEnv * env, jobject obj){
//(*env).相当于env->
//return (*env).NewStringUTF("I am from C++!!");//这是C++的用法
return env->NewStringUTF("你好!!");
//return (*env)->NewStringUTF(env,"你好!!");//这是C语言的用法
}
native方法是不混淆的
包名:.mtxxdemo
1.布局文件代码:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<ImageView
android:id="@+id/iv"
android:src="@drawable/leiju"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<Button
android:onClick="lomo"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="lomo效果" />
</LinearLayout>
Java部分代码
//点击事件-但点击后把ImageView的图片,转换成lomo效果
public void lomo(View view){
//1.需要获得图片的像数矩阵
Bitmap map = BitmapFactory.decodeResource(getResources(), R.drawable.leiju);
int[] pixels = new int[map.getWidth()*map.getHeight()];
//此方法执行后,pixels数组里面已经有了图片的像数数组
map.getPixels(pixels , 0, map.getWidth(), 0, 0, map.getWidth(), map.getHeight());
//2.把像数矩阵传递给C语言,让它帮我们设置效果
JNI jni = new JNI();
/**
* p1:图片的像数矩阵
* p2:图片的宽
* p3:图片的高
*/
//C语言之间控制的是内存,会直接把像数数组的值修改
jni.StyleLomoB(pixels, map.getWidth(), map.getHeight());
//3.像数矩阵已经改变,根据颜色矩阵创建一种图片设置回ImageView
Bitmap bm= Bitmap.createBitmap(pixels, map.getWidth(), map.getHeight(), Config.ARGB_8888);
iv.setImageBitmap(bm);
}
JNI代码通过反编译得到,但包名和美图秀秀必须一样。部分代码如下
package com.mt.mtxx.image;
public class JNI {
{
System.loadLibrary("mtimage-jni");
}
public native void StyleLomoHDR(int[] p1, int p2, int p3);
public native void StyleLomoC(int[] p1, int p2, int p3);
public native void StyleLomoB(int[] p1, int p2, int p3);
public native byte[] deal(byte[] p1, int p2, int p3, int p4, int p5, String p6);
}
本教程由尚硅谷教育大数据研究院出品,如需转载请注明来源。