最近朋友面试老是被问到Android DNK,问JNI调用的原理。对此小弟对面试官很想吐槽一下,请不要装逼,装逼澡雷劈。个人认为,如果项目中需要使用JNI调用C/C++代码, 那么说明使用Java 会严重影响了效率, 那么这个C/C++代码一定不是Android开发写的。一是:毕竟是Java开发,不是C/C++开发。二是:赚的是Java开发的钱,不是C/C++开发。那么请各位面试官不要问JNI这么高雅的问题。 没有意义。如果项目中真的需要用到JNI,那么我相信 使用大Google能在一个小时内解决问题。因此我认为JNI不是用来装高逼格的。
如果面试官问NDK,我建议如此回答:
我会使用JNI调用C/C++的代码, 但是如果让我去用C/C++去实现相关业务的算法代码,这我做不了。
吐槽归吐槽但是需要了解的还是要去了解一下。只能说用渊博的知识打动装逼般的面试官。
下面是Mac环境使用NDK
编辑工具:Android Studio
创建一个JNI的加载类,比如LoadJNI.java
public class LoadJNI {
static {
System.loadLibrary("JNIDemo");
}
public native String getString();
}
JNIDemo是模块名称
需要在build.grade中配置
defaultConfig {
applicationId "com.liu.learning.androidlearning" minSdkVersion 16
targetSdkVersion 23
versionCode 1
versionName "1.0"
ndk{
moduleName "JNIDemo"
}
}
打开电脑终端或者是Terminal
到达项目的java目录下,执行
javah -d ../jni com.liu.learning.androidlearning.jni.LoadJNI
../jni是java目录下的jin目录
该行命令是生成LoadJNI这个加载类的C/C++代码类,并放在jni目录中。
我以C++为例
以生成的.h头文件为原本,复制一个副本改成.cpp文件
在.cpp文件中给JNI加载方法中的参数类型加上参数名
使用方式:
LoadJNI jni = new LoadJNI();
Toast.makeText(MainActivity.this,jni.getString(),Toast.LENGTH_LONG).show();
网友评论