JNI基础(八)开辟C进程

这样慢慢的就体现出了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手机厂商,都自带一键清理内存的功能,可以很好的杀死这些除了系统的之外开启的乱七八糟的进程,避免系统卡顿。





  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值