1.一般在添加HAL层的时候,都会写到JNI 层(namespace android) ,如果形参对应不上,或者JNINativeMethod格式写的 不对就会导致开机无法进入主界面,以下是终端重复打印信息内容;
[ 16.010285] D1:camsys_extdev_deregister(331): Extdev(dev_id: 0x2000000) is deregister success
[ 16.010307] D1:camsys_irq_disconnect(664): All thread disconnect camsys_marvin irq success!
[ 16.010320] D1:camsys_mipiphy_clkin_cb(36): camsys_marvin mipi phy clk in turn off
[ 16.010329] D1:camsys_mipiphy_clkin_cb(36): camsys_marvin mipi phy clk in turn off
[ 16.010338] D1:camsys_release(763): camsys_marvin(deaa1510) is closed
[ 16.021091] D1:camsys_mipiphy_clkin_cb(34): camsys_marvin mipi phy clk in turn on
[ 16.021109] D1:camsys_mipiphy_clkin_cb(34): camsys_marvin mipi phy clk in turn on
[ 16.021118] D1:camsys_open(739): camsys_marvin(deaa1510) is opened!
[ 16.021231] E:camsys_extdev_register(239): Request RK30_PIN2_PB6(70) failed
[ 16.021240] D1:camsys_extdev_register(243): Get RK30_PIN2_PB6(70) gpio(active: 1) for dev_id 0x1000000 success!
[ 16.021257] D1:camsys_extdev_register(243): Get RK30_PIN0_PC1(17) gpio(active: 1) for dev_id 0x1000000 success!
[ 16.021267] D1:camsys_mrv_iomux_cb(92): marvin pinctrl select: isp_dvp10bit
[ 16.021375] D1:camsys_extdev_register(268): Extdev(dev_id: 0x1000000 dev_name: OV2659) register success
[ 16.026568] D1:camsys_mrv_clkout_cb(394): camsys_marvin clock out(rate: 24000000Hz) turn on
[ 16.027682] D1:camsys_sysctl_extdev(362): Sysctl 11 success, gpio(17) set 1
[ 16.028762] E:camsys_sysctl_extdev(369): Sysctl 8 failed, because gpio is NULL!
[ 16.029839] D1:camsys_sysctl_extdev(366): Sysctl 7 success, gpio(70) set 0
[ 16.035357] E:camsys_i2c_write(78): i2c write dev(addr:0x60) failed!
[ 16.035478] D1:camsys_sysctl_extdev(362): Sysctl 7 success, gpio(70) set 1
[ 16.037545] E:camsys_sysctl_extdev(369): Sysctl 8 failed, because gpio is NULL!
[ 16.038634] D1:camsys_sysctl_extdev(366): Sysctl 11 success, gpio(17) set 0
[ 16.039748] D1:camsys_mrv_clkout_cb(406): camsys_marvin clock out turn off
[ 16.046004] D1:camsys_extdev_deregister(331): Extdev(dev_id: 0x1000000) is deregister success
[ 16.046031] D1:camsys_irq_disconnect(664): All thread disconnect camsys_marvin irq success!
[ 16.046048] D1:camsys_mipiphy_clkin_cb(36): camsys_marvin mipi phy clk in turn off
[ 16.046057] D1:camsys_mipiphy_clkin_cb(36): camsys_marvin mipi phy clk in turn off
[ 16.046067] D1:camsys_release(763): camsys_marvin(deaa1510) is closed
[ 16.053446] D1:camsys_mipiphy_clkin_cb(34): camsys_marvin mipi phy clk in turn on
[ 16.053464] D1:camsys_mipiphy_clkin_cb(34): camsys_marvin mipi phy clk in turn on
[ 16.053475] D1:camsys_open(739): camsys_marvin(deaa1510) is opened!
[ 16.053581] D1:camsys_extdev_register(243): Get RK30_PIN2_PA0(56) gpio(active: 0) for dev_id 0x2000000 success!
[ 16.053594] D1:camsys_mrv_iomux_cb(92): marvin pinctrl select: default
[ 16.053626] D1:camsys_extdev_register(268): Extdev(dev_id: 0x2000000 dev_name: GS8604) register success
[ 16.058861] D1:camsys_mrv_clkout_cb(394): camsys_marvin clock out(rate: 24000000Hz) turn on
[ 16.059947] E:camsys_sysctl_extdev(369): Sysctl 11 failed, because gpio is NULL!
[ 16.061038] D1:camsys_sysctl_extdev(366): Sysctl 8 success, gpio(56) set 1
[ 16.062113] E:camsys_sysctl_extdev(369): Sysctl 7 failed, because gpio is NULL!
[ 16.067930] E:camsys_i2c_write(78): i2c write dev(addr:0x20) failed!
[ 16.069162] E:camsys_i2c_write(78): i2c write dev(addr:0x20) failed!
[ 16.069287] E:camsys_sysctl_extdev(369): Sysctl 7 failed, because gpio is NULL!
[ 16.071372] D1:camsys_sysctl_extdev(362): Sysctl 8 success, gpio(56) set 0
[ 16.072448] E:camsys_sysctl_extdev(369): Sysctl 11 failed, because gpio is NULL!
[ 16.073552] D1:camsys_mrv_clkout_cb(406): camsys_marvin clock out turn off
[ 16.092091] D1:camsys_extdev_deregister(331): Extdev(dev_id: 0x2000000) is deregister success
[ 16.092128] D1:camsys_irq_disconnect(664): All thread disconnect camsys_marvin irq success!
[ 16.092146] D1:camsys_mipiphy_clkin_cb(36): camsys_marvin mipi phy clk in turn off
[ 16.092156] D1:camsys_mipiphy_clkin_cb(36): camsys_marvin mipi phy clk in turn off
[ 16.092165] D1:camsys_release(763): camsys_marvin(deaa1510) is closed
[ 16.096348] D1:camsys_mipiphy_clkin_cb(34): camsys_marvin mipi phy clk in turn on
[ 16.096364] D1:camsys_mipiphy_clkin_cb(34): camsys_marvin mipi phy clk in turn on
[ 16.096372] D1:camsys_open(739): camsys_marvin(deaa1510) is opened!
[ 16.096449] D1:camsys_extdev_register(243): Get RK30_PIN2_PB7(71) gpio(active: 0) for dev_id 0x2000000 success!
[ 16.096463] D1:camsys_extdev_register(243): Get RK30_PIN0_PC1(17) gpio(active: 1) for dev_id 0x2000000 success!
[ 16.096502] rockchip_gpio_set:GPIO7-13 level = 1
[ 16.096507] rockchip_gpio_direction_output:set GPIO7-13 level 1
[ 16.096517] rk32_iomux_bit_op:GPIO7-13,reg=0x70,data=0xc000000,result=0x1
[ 16.096525] rockchip_pmx_gpio_set_direction:gpio_direction for pin 229 as gpio7-13 to output,data=0x3024,result=0x3024
[ 16.096532] D1:camsys_mrv_iomux_cb(92): marvin pinctrl select: isp_mipi_fl
[ 16.096557] D1:camsys_extdev_register(268): Extdev(dev_id: 0x2000000 dev_name: IMX214) register success
[ 16.101717] D1:camsys_mrv_clkout_cb(394): camsys_marvin clock out(rate: 24000000Hz) turn on
[ 16.102795] D1:camsys_sysctl_extdev(362): Sysctl 11 success, gpio(17) set 1
[ 16.103861] E:camsys_sysctl_extdev(369): Sysctl 8 failed, because gpio is NULL!
[ 16.104932] D1:camsys_sysctl_extdev(366): Sysctl 7 success, gpio(71) set 1
[ 16.110255] E:camsys_i2c_write(78): i2c write dev(addr:0x20) failed!
[ 16.111458] E:camsys_i2c_write(78): i2c write dev(addr:0x20) failed!
[ 16.111572] D1:camsys_sysctl_extdev(362): Sysctl 7 success, gpio(71) set 0
[ 16.113642] E:camsys_sysctl_extdev(369): Sysctl 8 failed, because gpio is NULL!
[ 16.114731] D1:camsys_sysctl_extdev(366): Sysctl 11 success, gpio(17) set 0
[ 16.115836] D1:camsys_mrv_clkout_cb(406): camsys_marvin clock out turn off
[ 16.122016] D1:camsys_extdev_deregister(331): Extdev(dev_id: 0x2000000) is deregister success
[ 16.122035] D1:camsys_irq_disconnect(664): All thread disconnect camsys_marvin irq success!
[ 16.122045] D1:camsys_mipiphy_clkin_cb(36): camsys_marvin mipi phy clk in turn off
[ 16.122053] D1:camsys_mipiphy_clkin_cb(36): camsys_marvin mipi phy clk in turn off
[ 16.122060] D1:camsys_release(763): camsys_marvin(deaa1510) is closed
2.JNINativeMethod 方法格式一定要写对!!!!
下面给出一段案例:
#include "jni.h"
#include "JNIHelp.h"
#include "android_runtime/AndroidRuntime.h"
#include <utils/misc.h>
#include <cutils/log.h>
#include <hardware/hardware.h>
#include <hardware/iic.h>
#include <stdio.h>
namespace android
{
struct iic_device *iic_dev = NULL;
static void iic_setVal(JNIEnv* env, jobject clazz, jint slaveAddr, jint regAddr, jint databuf) {
if(!iic_dev) {
ALOGE("iic JNI: device is not open.");
}
iic_dev->iic_write(iic_dev,slaveAddr,regAddr,databuf);
}
static jint iic_getVal(JNIEnv* env, jobject clazz,jint slaveAddr, jint regAddr) {
unsigned char data[1] = {0};
iic_dev->iic_read(iic_dev,slaveAddr,regAddr,data);
if(!iic_dev) {
ALOGE("iic JNI: device is not open.");
}
return data[0];
}
/*通过硬件模块ID来加载指定的硬件抽象层模块并打开硬件*/
static jboolean iic_init(JNIEnv* env, jclass clazz) {
iic_module_t *module;
int err;
err = hw_get_module(IIC_HARDWARE_MODULE_ID,(const struct hw_module_t**)&module);
if (err != 0) {
ALOGE("Error acquiring iic hardware module: %d", err);
return 0;
}
err = iic_open(&(module->common), &iic_dev);
if (err != 0) {
ALOGE("Error opening iic hardware module: %d", err);
return 0;
}
ALOGE("iic device is opening...");
return 1;
}
/*JNI方法表*/
static const JNINativeMethod method_table[] = {
{"init_native", "()Z", (void*)iic_init},
{"setVal_native", "(III)V", (void*)iic_setVal},
{"getVal_native", "(II)I", (void*)iic_getVal},
};
/*注册JNI方法*/
int register_android_server_IICService(JNIEnv *env) {
return jniRegisterNativeMethods(env, "com/android/server/IICService", method_table, NELEM(method_table));
}
};
static jboolean iic_init(JNIEnv* env, jclass clazz);= {"init_native", "()Z", (void*)iic_init},
static void iic_setVal(JNIEnv* env, jobject clazz, jint slaveAddr, jint regAddr, jint databuf);= {"setVal_native", "(III)V", (void*)iic_setVal},
static jint iic_getVal(JNIEnv* env, jobject clazz,jint slaveAddr, jint regAddr);= {"getVal_native", "(II)I", (void*)iic_getVal},
各种形参类型一定要对应上,以及JNI字段描述符(JavaNative Interface FieldDescriptors);只要写错一点点,都会导致无法进入主界面,或者app 不正常!!!!!