这样慢慢的就体现出了jni的强大,它可以通过C做到许多java做不到的事情,比如开辟一个C进程,我们知道java进程随时都有可能被系统杀死,并且在java进程中开辟出的任何线程也会随之被杀死,所以有时候我们需要开辟一个独立于java进程的进程来做一些事情,这个时候就需要用jni来做到。
java代码:
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final JNI jni = new JNI();
jni.forkCprogress();
}
}
public class JNI {
/**
* 加载动态链接库
* 也就是c代码编译好的so文件
*/
static {
System.loadLibrary("app");
}
public native void forkCprogress();
}
C代码:
JNIEXPORT void JNICALL Java_com_example_jnidemo_JNI_forkCprogress (JNIEnv *env, jobject obj){
//开辟C进程
int pid = fork();
//如果大于等于0,说明进程开辟成功
if(pid >= 0){
int flag = 1;
while (flag){
LOGI("C进程偷偷运行中..");
}
}
};
讲解:
AS集成在c代码中打印logcat步骤:
在导入头文件部分加入:
#include <android/log.h>
#define LOG_TAG "System.out"
#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG, LOG_TAG, __VA_ARGS__)
#define LOGI(...) __android_log_print(ANDROID_LOG_INFO, LOG_TAG, __VA_ARGS__)
在build.gradle的defaultConfig中加入ndk配置
ndk{
ldLibs "log"
}
这样就可以打印日志了。
开辟进程功能需要导入头文件:
#include <unistd.h>
这就是当初那么流氓软件的原理,都是用c做到的,所以我们怎么一键清除都没用。。不过现在5.0系统以上已经基本上好多了吧,因为各大ROM已经对这一现象进行了限制,这也是前几年影响android机卡的原因,根本无法控制,因为这个C进程,一般杀不死,早几年用java做的手机卫士了什么的,也是无权杀死这些C进程的,只能清理清理垃圾,现在各大ROM手机厂商,都自带一键清理内存的功能,可以很好的杀死这些除了系统的之外开启的乱七八糟的进程,避免系统卡顿。