博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android 下 JNI 开发
阅读量:4046 次
发布时间:2019-05-25

本文共 2914 字,大约阅读时间需要 9 分钟。

Day3

01_回顾NDK开发流程-25

 public native String sayHello();

1. 关联NDK: Window -> Preferences -> Android -> NDK

2. 创建Android工程, 声明native方法.

3. 设置函数库名字: 右键工程 -> Android Tools -> App Native support

4. 使用javah生成.h的头文件, 并把.h文件拷贝到工程下jni文件夹中.

5. c代码提示: 右键工程 -> Properties -> C/C++ General ->  Path and Symbols

// Includes -> Add -> File system 选中以下路径.

 platforms\android-18\arch-arm\usr\include

 

6. 把后缀名.cpp改成.c, 实现native方法.

7. java代码中加载动态库, 调用native方法.

8.演示自动编译和直接运行

9.C返回中文出现乱编并解决

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

10.C++和中文乱码

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语言的用法

}

 

 

 

 

02_美图秀秀案例-35

安装美图秀秀到模拟器,并演示处理图片

使用ColorMatrixDemo.swf修改数组值,改变图片颜色值

反编译美图秀秀和提取美图秀秀的.so文件

  native方法是不混淆的

创建Android工程:MTXXDemo

  包名:.mtxxdemo

 

实现特效效果LomoB

 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);

    

}

 

本教程由尚硅谷教育大数据研究院出品,如需转载请注明来源。

你可能感兴趣的文章
zookeeper
查看>>
Idea导入的工程看不到src等代码
查看>>
技术栈
查看>>
Jenkins中shell-script执行报错sh: line 2: npm: command not found
查看>>
8.X版本的node打包时,gulp命令报错 require.extensions.hasownproperty
查看>>
Jenkins 启动命令
查看>>
Maven项目版本继承 – 我必须指定父版本?
查看>>
通过C++反射实现C++与任意脚本(lua、js等)的交互(二)
查看>>
利用清华镜像站解决pip超时问题
查看>>
微信小程序开发全线记录
查看>>
CCF 分蛋糕
查看>>
解决python2.7中UnicodeEncodeError
查看>>
小谈python 输出
查看>>
Django objects.all()、objects.get()与objects.filter()之间的区别介绍
查看>>
python:如何将excel文件转化成CSV格式
查看>>
机器学习实战之决策树(一)
查看>>
机器学习实战之决策树二
查看>>
[LeetCode By Python]7 Reverse Integer
查看>>
[leetCode By Python] 14. Longest Common Prefix
查看>>
[LeetCode By Python]121. Best Time to Buy and Sell Stock
查看>>