JNI开发第三步:
JNI文件的编写 Android.mk和myjni.c(或myjni.cpp)
点亮一个LED灯
1.首先linux下要已经弄好了驱动,并已经知道了设备名称:LED@LZM@FJICC
2.在eclipse下新建立一个android app工程TEST。然后在TEST下新建一个文件夹jni。在jni文件夹下新建两个文件Android.mk和test-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
#defineDEV_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();
}
}
相关推荐
android_ndk_jni_dev.zip 配套例子
windows64位平台下编译ollvm6.0(集成了字符串混淆功能)生成的lib和bin文件,放在android-ndk-r18b-windows-x86_64\android-ndk-r18b\toolchains\llvm\prebuilt\windows-x86_64目录下面即可使用。(因为lib和bin...
3. jni/Application.mk 文件中加入 APP_MODULE : = android-4 4. 在jni目录中添加双击此批处理即可编译库文件 注1:0.13版本的cocosw2d-x 搭配 Eclipse 也可以使用这个批处理,不要使用NDK自带的ndk-build.cmd ...
NULL 博文链接:https://liuzongming.iteye.com/blog/1914012
Android_NDK开发实例, 利用NDK生成SO库,使用SO库进行JNI调用,在Android sdcard创建文件并写入数据。
ndk_c_demo3.30.img.ok Jnidemo-master.3.17.final.ok
第三步:将解压后的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 NDK 开发】JNI 方法解析 ( 字符串数组参数传递 | 字符串遍历 | 类型强转 | Java 字符串与 C 字符串转换 | 字符串释放 ) 博客地址 : https://hanshuliang.blog.csdn.net/article/details/104103097 I...
实现了java-c的互调 1.hello-jin-c是linux下的c...(使用NDK编译成.so文件,供java层调用)。 2.helloJni是java工程。(里面通过JNI调用下面.so中提供的c的实现。) 同理.so里面也可以调用回调java里面实现的文件。
android-ndk(android-ndk-r25b-linux.zip)适用于Linux系统
Android NDK jni使用,包括java调用,脚本编写,和C++代码实现
Android studio 编译第一个NDK程序的详细教程的代码,附上Android studio编写第一个NDK工程的过程详解文章的链接https://blog.csdn.net/weixin_37639900/article/details/89680670
第3章 用JNI实现与原生代码通信 3.1 什么是JNI 3.2 以一个示例开始 3.2.1 原生方法的声明 3.2.2 加载共享库 3.2.3 实现原生方法 3.3 数据类型 3.3.1 基本数据类型 3.3.2 引用类型 3.4 对引用数据类型的操作 3.4.1 ...
【Android NDK 开发】JNI 方法解析 ( int 数组传递 | jintArray 类型 | 数组转换 | 获取数组长度 | 获取数组元素 | 指针遍历数组 | 数组返回值设置 ) 博客地址 : ...
【Android NDK 开发】JNI 方法解析 ( C/C++ 调用 Java 方法 | 函数签名 | 调用对象方法 | 调用静态方法 ) I . 调用 Java 方法流程 II . 获取 jclass 对象 ( GetObjectClass ) III . 获取 jclass 对象 ( Find...
Android.mk文件 c++的调用方法为: 代码如下:LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := TestNdk LOCAL_CPP_EXTENSION :=com_ndk_test_JniClient.cpp include $(BUILD_SHARED_LIBRARY) c...
Android之so文件、JNI和NDK
android-ndk(android-ndk-r26b-windows.zip)适用于Windows系统