久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3227|回復: 0
收起左側

安卓jni學習筆記

[復制鏈接]
ID:639532 發表于 2019-11-11 10:28 | 顯示全部樓層 |閱讀模式
Jni study

2019-2-18
在MTK6735平臺下,在eclipse.exe中做幾個按鈕調用JNI層,控制GPIO7的LED,亮滅閃爍。

eclipse使用教程:https://jingyan.baidu.com/article/0a52e3f4e241a0bf62ed72a7.html
eclipse 開發 jni:https://blog.csdn.net/dg_summer/article/details/52880232
解決NDK開發中Eclipse報錯“Unresolved inclusion jni.h”的最終方法:https://blog.csdn.net/xiaogazhang/article/details/46888781


一、JAVA的編寫
E:/%E6%9C%89%E9%81%93%E4%BA%91%E7%AC%94%E8%AE%B0/weixinobU7VjiHeyJ5xDKs8qyaJ-NAI2_E/aa8aec0db74e478ba5a48d8f7dd1bb64/482.png

    1、fragment_main.xml 如下
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="example.test.MainActivity$PlaceholderFragment" >

    <TextView
        android:id="@+id/textView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentTop="true"
        android:layout_marginLeft="230dp"
        android:layout_marginTop="0dp"
        android:text="GPIO7 control"
        android:textSize="50sp" />
   
     <TextView
        android:id="@+id/tv_text"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

    <Button
        android:id="@+id/button1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_below="@+id/textView1"
        android:layout_marginLeft="59dp"
        android:layout_marginTop="250dp"
        android:minHeight="100dip"
        android:minWidth="120dip"
        android:text="LED_ON" />

    <Button
        android:id="@+id/button2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignBaseline="@+id/button1"
        android:layout_alignBottom="@+id/button1"
        android:layout_centerHorizontal="true"
        android:minHeight="100dip"
        android:minWidth="120dip"
        android:text="LED_OFF" />

    <Button
        android:id="@+id/button3"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignBaseline="@+id/button2"
        android:layout_alignBottom="@+id/button2"
        android:layout_marginLeft="56dp"
        android:layout_toRightOf="@+id/textView1"
        android:minHeight="100dip"
        android:minWidth="120dip"
        android:text="LED_HZ" />

</RelativeLayout>

    2、MainActivity.java 如下
package example.test;


import example.test.R;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;


public class MainActivity extends Activity implements OnClickListener {

        private TextView tv_text;
       
       
        // 聲明自定義本地庫方法接口
        public native int LEDON();//void不能寫
        public native int LEDOFF();
        public native int LEDONOFF();
        // 自動加載本地庫文件,如文件名全稱為 gpio.so
        static{
                System.loadLibrary("gpio");
        }
       
       
       
        @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //加載一個布局
        setContentView(R.layout.fragment_main);     
        
        // 找到按鈕
        Button btn_call = (Button) findViewById(R.id.button1);
        Button btn_call1 = (Button) findViewById(R.id.button2);
        Button btn_call2 = (Button) findViewById(R.id.button3);

        // 給button按鈕設置一個點擊事件
        btn_call.setOnClickListener(this);
        btn_call1.setOnClickListener(this);
        btn_call2.setOnClickListener(this);
      
        }

         // 當點擊按鈕的時候執行
    public void onClick(View v)
    {
        switch (v.getId())
        {
                case R.id.button1: LEDOFF(); System.out.println("1按鈕被點擊了");  break;
                case R.id.button2: LEDON(); System.out.println("2按鈕被點擊了");  break;
                case R.id.button3: LEDONOFF(); System.out.println("3按鈕被點擊了"); break;
                default:
                    break;
        }
    }
      
}

3、JNI層編寫
          Android.mk:
LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_LDLIBS :=-llog
LOCAL_MODULE    := gpio
LOCAL_SRC_FILES := gpio.cpp

include $(BUILD_SHARED_LIBRARY)

        gpio.c:
#include <jni.h>

//#include <termios.h>
//#include <unistd.h>
//#include <sys/types.h>
//#include <sys/stat.h>
#include <fcntl.h>
//#include <string.h>
//#include <stdio.h>
//#include <stdlib.h>
//#include <dirent.h>
//#include "mtk_gpio.h"
//#include <sys/ioctl.h>
#include <linux/ioctl.h>
//#include <errno.h>
#include <android/log.h>

#define TAG "BSK_MTK_GPIO"//過濾信息用的
#define ALOGD(...) __android_log_print(ANDROID_LOG_DEBUG,TAG ,__VA_ARGS__) // 定義LOGD類型
#define ALOGI(...) __android_log_print(ANDROID_LOG_INFO,TAG ,__VA_ARGS__) // 定義LOGI類型
#define ALOGW(...) __android_log_print(ANDROID_LOG_WARN,TAG ,__VA_ARGS__) // 定義LOGW類型
#define ALOGE(...) __android_log_print(ANDROID_LOG_ERROR,TAG ,__VA_ARGS__) // 定義LOGE類型
#define ALOGF(...) __android_log_print(ANDROID_LOG_FATAL,TAG ,__VA_ARGS__) // 定義LOGF類型

//#define BSK_LED_ON                _IOW('L',  1, unsigned long)
//#define BSK_LED_OFF                _IOW('L',  2, unsigned long)

extern "C" {
        JNIEXPORT jint  JNICALL  Java_example_test_MainActivity_LEDON(JNIEnv * env, jobject obj);
        JNIEXPORT jint  JNICALL  Java_example_test_MainActivity_LEDOFF(JNIEnv * env, jobject obj);
        JNIEXPORT jint  JNICALL  Java_example_test_MainActivity_LEDONOFF(JNIEnv * env, jobject obj);

//        JNIEXPORT jint  JNICALL  Java_example_gpio_MainActivity_setmode(JNIEnv * env, jobject obj, jint port,jint mode);
//        JNIEXPORT int JNICALL Java_com_bsk_xp6_MainActivity_Setthreshold(JNIEnv * env, jobject obj, jint channel);
};


JNIEXPORT jint  JNICALL  Java_example_test_MainActivity_LEDON(JNIEnv * env, jobject obj)
{
        int fd,ret;

        fd = open("/dev/led_device_file", O_RDWR);
        if(fd < 0)
        {
                ALOGD("open led_drv fb = %d\n",fd);
                return -1;
        }

        ret = ioctl(fd, 0x01, 1);//D1--on
        if(ret < 0)
                ALOGD("ioctl ret = %d\n",ret);

        close(fd);

        ALOGD("LED OFF !!!!!!!!!!!!!!!!!\n");
        return 0;
}


JNIEXPORT jint  JNICALL  Java_example_test_MainActivity_LEDOFF(JNIEnv * env, jobject obj)
{
        int fd,ret;

        fd = open("/dev/led_device_file", O_RDWR);
        if(fd < 0)
        {
                ALOGD("open led_drv\n");
                return -1;
        }

        ret = ioctl(fd, 0x02, 1);//D1--off
        if(ret < 0)
                ALOGD("ioctl ret = %d\n",ret);

        close(fd);

        ALOGD("LED ON !!!!!!!!!!!!!!!!!!!!!!!!!!!\n");
        return 0;
}

JNIEXPORT jint  JNICALL  Java_example_test_MainActivity_LEDONOFF(JNIEnv * env, jobject obj)
{
        int fd,ret,i;

        fd = open("/dev/led_device_file", O_RDWR);
        if(fd < 0)
        {
                ALOGD("open led_drv\n");
                return -1;
        }


        ret = ioctl(fd, 0x01, 1);
        if(ret < 0)
                ALOGD("ioctl ret = %d\n",ret);

        for(i=1; i<20; i++)
        {
                usleep(200*1000);
                ioctl(fd, i%3, 1);
        }

        close(fd);

        ALOGD("LED ON OFF !!!!!!!!!!!!!!!!!!!!!!!!!!!\n");
        return 0;
}

    PS:   cmd        --->                cd App工程目錄        --->        “ndk-build ”(該命令使cpp生成so)

二、調試JNI的內核調試打印手段

1、靜態,輸入以下命令  -》調試(按鍵按下) -ctrl+c退出 -》 查看輸出信息
adb shell cat /proc/kmsg >1.txt

2、動態,命令過濾你的內核調試信息然后輸出
grep "MTK*" /proc/kmsg
        或者
cat /proc/kmsg | grep tttttttttttttttttttttt

三、其它問題描述

1、生成Android App時最少版本4.0以上就不會生成appcompat_v7項目(為了兼容低版本產生的)       
2、eclipse編譯apk的時候遇到問題,但沒有提示,新建android工程提示:Failed to load properties file for project
    解決:
                    Properties->Java ->Build Path->class path Varable
                    添加變量ANDROID_SDK_HOME,指向sdk目錄。
     
                    但是編譯時候卡住了,,,,
                    后來把workspace(工作空間)里的隱藏文件刪了,所有工程重新導入,ok了。









評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚洲精选久久 | 久精品久久 | 蜜桃视频在线观看www社区 | 亚洲视频一区 | 国产人成精品一区二区三 | 亚洲成av| 亚洲成人精选 | 国产视频久久久 | 成人av免费看 | 国产成人jvid在线播放 | 91在线精品视频 | 亚洲国产精品日韩av不卡在线 | 免费午夜视频 | 91精品国产一区二区三区蜜臀 | 国产精品久久久久久久久久 | 久久综合狠狠综合久久综合88 | 欧美日韩最新 | 国产伦精品一区二区三区照片91 | 欧美日本高清 | 欧美精品一区二区三区在线 | 亚洲综合视频一区 | 天天干狠狠操 | 国产精品美女久久久久aⅴ国产馆 | 在线免费看毛片 | 久久久久久91香蕉国产 | 老牛影视av一区二区在线观看 | 黑人精品| 成人不卡视频 | 日日人人| 欧美一区二不卡视频 | 精品一二三区 | 久久久精品一区二区三区四季av | 最新国产精品视频 | 久久久久久国模大尺度人体 | 鲁视频| 免费一级黄色 | 在线观看中文字幕av | 日韩中文字幕视频 | 亚洲视频一区二区 | 亚洲午夜精品一区二区三区他趣 | 一区二区成人 |