`

JNI开发第三步:20130801_NDK_JNI的.so文件开发-安卓访问LINUX驱动

 
阅读更多

JNI开发第三步:

            JNI文件的编写 Android.mk和myjni.c(或myjni.cpp)

 

点亮一个LED

1.首先linux下要已经弄好了驱动,并已经知道了设备名LED@LZM@FJICC

2.eclipse下新建立一个android app工程TEST。然后在TEST下新建一个文件夹jni。在jni文件夹下新建两个文件Android.mktest-jni.c

Android.mk

# Copyright (C) 2009 The Android Open Source Project

#

# Licensed under the Apache License, Version 2.0 (the "License");

# you may not use this file except in compliance with the License.

# You may obtain a copy of the License at

#

#      http://www.apache.org/licenses/LICENSE-2.0

#

# Unless required by applicable law or agreed to in writing, software

# distributed under the License is distributed on an "AS IS" BASIS,

# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

# See the License for the specific language governing permissions and

# limitations under the License.

#

LOCAL_PATH := $(call my-dir)

include$(CLEAR_VARS)

LOCAL_MODULE    := test-jni

LOCAL_SRC_FILES := test-jni.c

include$(BUILD_SHARED_LIBRARY)

 

test-jni.c

#include<string.h>

#include<jni.h>

#include<ioctl.h>

#include<fcntl.h>

 

#define VIB_ON 0x11

#define VIB_OFF 0x22

#define  DEV_NAME "/dev/LED@LZM@FJICC"

/* This is a trivial JNI example where we use a native method

 * to return a new VM String. See the corresponding Java source

 * file located at:

 *

 *   apps/samples/hello-jni/project/src/com/example/hellojni/HelloJni.java

 */

jstring

Java_com_example_TEST__stringFromJNI( JNIEnv* env, jobject thiz )

{

    return (*env)->NewStringUTF(env, "Hello from JNI !");

}

 

jint

Java_com_example_TEST_TESTCLASS_Init(JNIEnv* env)

{

 

      int fd=open(DEV_NAME,O_RDWR);

      return fd;

}

jint

Java_com_example_TEST_TESTCLASS_IOCTLLED( JNIEnv* env, jobject thiz, jint controlcode,jint ledid ,jint fd)

{

       /* LED */

    int CTLCODE = controlcode;

    switch(CTLCODE)

    {  case VIB_ON:

              {

              ioctl(fd,1,ledid);//setLedState( 0, 1 );//调用驱动程序中的ioctrl接口,把命令传下去,实现硬件操作

              break;

              }

       case VIB_OFF:

             {

            ioctl(fd,0,ledid);////  setLedState( 0, 0 );//调用驱动程序中的ioctrl接口,把命令传下去,实现硬件操作

             break;

             }

       default:break;

     }

       return 1;

}

 

com_example_TEST:这个需要和我们建立的TEST工程相对应,我们建立的TEST类位于src文件夹下的:com.example.TEST中的MainActivity.java类。

TESTCLASS:是我们后面调用JNI生成的.so文件时需要建立的类:com.example.TEST下的TESTCLASS.java类。

IOCTLLED是在JNI中实现的方法,到时候在java应用程序中调用用的。

注意:test-jni.c文件中的#include<ioctl.h>  #include<fcntl.h>这两个文件时从linux/linux/include/asm-generic/…)下拷贝出来的,放在jni目录下。

3.然后打开NDK软件,在cmd命令窗口中,转到我们建立的工程目录下的jni文件下面,输入  $NDK/ndk-build 就可以生成了:libtest-jni.so文件。

4.编写应用程序:在com.example.TEST下建立一个类:TESTCLASS.java

package com.example.TEST;

import android.util.Log;

publicclass TESTCLASS {

publicstaticnative String stringFromJNI();

publicstaticnativeint Init();

publicstaticnativeint IOCTLLED(int controlcode,int ledID,int fd);

static {

    try {

    System.loadLibrary("test-jni");

    } catch (UnsatisfiedLinkError e) {

        Log.d("HardwareControler", "HardwareControler ibrary not found!");

    }

}

}

5.编写应用程序实现调用库中函数MainActivity.java

package com.example.TEST;

 

import android.os.Bundle;

import android.app.Activity;

import android.view.Menu;

import android.view.View;

import android.widget.Button;

import android.widget.Toast;

 

publicclass MainActivity extends Activity {

    private Button btn_on;

    private Button btn_off;

    publicstaticfinalintVIB_ON = 0x11; 

    publicstaticfinalintVIB_OFF = 0x22;  

/**如果去掉public class TESTCLASS 中的那些static这里就可以定义一个类,实例化TESTCLASS TESTCLASS mTESTCLASS001;后面的函数调用就可以使用这个对象了**/

    @Override

    protectedvoid onCreate(Bundle savedInstanceState) {

       super.onCreate(savedInstanceState);

       setContentView(R.layout.activity_main);

/**如果去掉public class TESTCLASS 中的那些static实例化TESTCLASS TESTCLASS mTESTCLASS001;那么这里就要开辟一个类了哦:

mTESTCLASS001 = new TESTCLASS();**/

       btn_on = (Button)findViewById(R.id.button1);

       btn_off = (Button)findViewById(R.id.button2);

       /**比如这里就可以用了:fd = mTESTCLASS001.Init();*****/

finalint fd = TESTCLASS.Init();

       if(fd == -1)

           Toast.makeText(MainActivity.this, "没有打开设备", Toast.LENGTH_SHORT).show();

      

       btn_on.setOnClickListener(new Button.OnClickListener(){

 

           @Override

           publicvoid onClick(View arg0) {

              // TODO Auto-generated method stub

              TESTCLASS.IOCTLLED(VIB_ON,0, fd);

           }

       });

       btn_off.setOnClickListener(new Button.OnClickListener(){

 

           @Override

           publicvoid onClick(View v) {

              // TODO Auto-generated method stub

              TESTCLASS.IOCTLLED(VIB_OFF,0, fd);

           }});

    }

}

 

说明:黄色和绿色部分:

TESTCLASS:这个指的就是我们建立的类TESTCLASS.java

IOCTLLED:指的就是在类中的方法。

 

6.编译好后,把生成的bin/TEST.apk拷贝到对应的开发板上,就可以运行了。这里要注意,由于驱动是自己加的,要运行需要权限提升,在终端输入#chmod 777 /dev/LED@LZM@FJICC,然后在运行TEST程序就可以了。

NOTE:

对于Android工程 Eclipse里编译好的.so文件放到 libs\armeabi下以后, 这样.so文件就可以打包到apk文件里,在apk装到手机上以后  libs\armeabi下的.so文件应该就会解压到/data/data/project的包名/lib下。

a) loadLibrary调用的时候需要去掉lib前缀 System.loadLibrary("JNITest"); 

b) load调用的时候需要写全路径名且不能去掉lib前缀因为这里是当成一个普通文件读取的 System.load("/data/data/com.test.test/libJNITest.so");

 

2.How to promote the right of Linux's Driver in the Android?

 

void changePerm()
{
   
Process chperm;
   
try{
        chperm
=Runtime.getRuntime().exec("su");


  
DataOutputStream os =
         
newDataOutputStream(chperm.getOutputStream());
        os
.writeBytes("chmod 777 /dev/radio\n");
        os
.flush();

        os
.writeBytes("exit\n");
        os
.flush();

          chperm
.waitFor();

}catch(IOException e){
   
// TODO Auto-generated catch block
    e
.printStackTrace();
}catch(InterruptedException e){
   
// TODO Auto-generated catch block
    e
.printStackTrace();
}
}

分享到:
评论

相关推荐

    JNI开发第二步:20130726 NDK_JNI使用

    标题“JNI开发第二步:20130726 NDK_JNI使用”涉及到的是Android平台下的JNI(Java Native Interface)技术与NDK(Native Development Kit)的结合使用。JNI是Java平台标准的一部分,它允许Java代码和其他语言写的代码...

    Android_NDK.zip_Android so库_NDK SO_android_android so_调用.so

    总之,Android_NDK.zip中的文档"Android_NDK开发实例.doc"应当详细阐述了如何运用NDK创建.so库,以及如何在Android应用中通过JNI调用这些库进行文件操作。通过学习这些知识,开发者能够提升Android应用的性能,并...

    android-ndk(android-ndk-r25b-linux.zip)

    这个“android-ndk-r25b-linux.zip”文件是NDK的一个特定版本,即r25b,专为Linux操作系统设计。在Android应用开发中,NDK扮演着至关重要的角色,它允许开发者使用原生代码(如C和C++)来编写部分应用,以提高性能、...

    android-ndk-r20-linux-x86_64.zip

    《深入理解Android NDK:基于android-ndk-r20-linux-x86_64.zip的探讨》 Android NDK,全称为Native Development Kit,是Google为开发者提供的一套工具集合,它允许开发者使用C和C++语言进行Android应用程序的开发...

    android_ndk_jni_dev_HelloNDK.zip

    《Android NDK与JNI开发详解:HelloNDK实践》 Android Native Development Kit(NDK)是Google提供的一款工具集,允许开发者在Android平台上使用C/C++编写原生代码,从而提高应用程序的性能和效率。JNI(Java ...

    NDK工具android-ndk-r10e-linux-x86_64

    标题中的"android-ndk-r10e-linux-x86_64"表明这是一个特定版本的NDK,即版本号为R10e,针对Linux 64位系统的版本。 **NDK的基本概念与功能:** 1. **本地库开发:**NDK允许开发者使用C/C++编写部分或全部应用代码...

    windows_ollvm6.0_ndk_r18b.7z.001(001和002都下载之后,放在一起才能解压)

    windows64位平台下编译ollvm6.0(集成了字符串混淆功能)生成的lib和bin文件,放在android-ndk-r18b-windows-x86_64\android-ndk-r18b\toolchains\llvm\prebuilt\windows-x86_64目录下面即可使用。(因为lib和bin...

    JNI.rar_Android jni_JNI语句_android_jni_site:www.pudn.com

    使用NDK(Native Development Kit)将本地代码编译为动态链接库(.so文件)。NDK提供了`javah`工具,用于生成本地方法的头文件,然后使用`gcc`或`g++`进行编译。 ### 加载本地库 在Java的静态初始化块`static {}`中...

    MyJni.rar_Android jni_JNI调用脚本_NDK_android_jni

    在Android开发中,JNI(Java Native Interface)是一个关键的技术,它允许Java代码和其他语言写的代码进行交互。"MyJni.rar"这个压缩包文件显然包含了关于Android JNI的实践教程,涵盖了从Java层调用到C/C++代码的...

    cocos2d-1.0.1-x-0.13.0-beta--android-ndk-windows构建批处理.zip

    3. jni/Application.mk 文件中加入 APP_MODULE : = android-4 4. 在jni目录中添加双击此批处理即可编译库文件 注1:0.13版本的cocosw2d-x 搭配 Eclipse 也可以使用这个批处理,不要使用NDK自带的ndk-build.cmd ...

    android_ndk_linux-r64位下载

    在给定的标题“android_ndk_linux-r64位下载”中,我们关注的是适用于Linux 64位系统的Android NDK的一个特定版本,即r16b。 **NDK的用途** 1. **性能优化**:对于计算密集型应用,如游戏引擎、图形处理或物理模拟...

    java_jni_mytest.tar.gz_android_jni

    在Android开发中,JNI被广泛用于优化性能、调用本地库、实现特定硬件功能或者接入C/C++的第三方库。在这个“java_jni_mytest.tar.gz_android_jni”压缩包中,包含了一个专门为初学者准备的Android JNI编程实例,帮助...

    ndk_c_demo3.30.img.ok Jnidemo-master.3.17.final.ok2.zip

    NDK是Android开发的一部分,允许开发者使用C和C++来编写高性能的原生代码,而JNI则是Java平台上的一个标准接口,用于在Java代码和本地代码之间进行交互。 首先,让我们深入了解NDK。NDK提供了一个工具集,用于编译C...

    android-ndk(android-ndk-r26b-windows.zip)

    5. **预编译库集成**:如果项目依赖于第三方C/C++库,NDK可以帮助预编译这些库,使其能在Android设备上运行。 6. **安全与隐私**:某些敏感操作,如加密算法,可能更适合在本地代码中执行,以避免暴露Java层的敏感...

    android-ndk(android-ndk-r26b-linux.zip)

    这个“android-ndk-r26b-linux.zip”文件是NDK的一个特定版本——R26B,特别为Linux操作系统设计。 NDK的主要功能和知识点包括: 1. **原生库支持**:NDK允许开发者创建原生库,这些库可以直接在设备的CPU上运行,...

    windows_ollvm6.0_ndk_r18b.7z.002(001和002都下载之后,放在一起才能解压)

    第三步:将解压后的lib文件夹和bin文件复制到android-ndk-r18b-windows-x86_64\android-ndk-r18b\toolchains\llvm\prebuilt\windows-x86_64文件夹下面 Android.mk文件中配置混淆 LOCAL_CFLAGS += -mllvm -sub -mllvm...

    android studio ndk-build 编译C生成.so文件demo

    Android Studio配合NDK(Native Development Kit)提供了一种原生代码编译工具——`ndk-build`,可以将C/C++代码编译为.so(共享对象)文件,然后在Java层通过JNI(Java Native Interface)调用。本文将详细讲解如何...

Global site tag (gtag.js) - Google Analytics