Jni 函数的静态绑定

简介:

    Jni函数绑定有两种方法,一种是静态绑定,一种是注册方式。当前介绍静态绑定

1 构造Java类

package cn.search;


import java.io.File;


import android.os.Environment;

import android.util.Log;


public class PoiResolver{


  public native String GetDistrictName(String storagePath, double longtitude, double latitude);


  public native String GetPOIName(String storagePath, double longtitude, double latitude);


  public native String GetRoadName(String storagePath, double longtitude, double latitude); 

}

说明:native修饰符告诉Java编译器这是一个绑定到JNI的函数原型

2 利用javah生成头文件

本项目使用Eclipse创建Android工程,进入工程的顶级目录,PoiResolver类文件保存在src/cn/search目录下

在顶级目录下执行如下在指令:javah -o jni/cn_search.h -classpath src/ -jni  cn.search.PoiResolver

-o:指定输出的文件名称,将在jni下创建cn_search.h文件,然后将头文件内容写入该文件

-classpath:指定需要生成h文件的类所在的包所在的位置(包cn.search在src/目录下)

-jni:指定需要生成h文件的类,这个时候必须指定详细的包名+类名

可以使用-d参数,但是不能够再使用-o参数,没有指定文件名的情况下,默认名称为包名+类名.h


注意

    在jni的.c文件中调用env,必须这样调用:return (*env)->NewStringUTF(env, "Hello !");

    在jni的.cpp文件中调用env,必须这样调用:return env->NewStringUTF("Hello !");


3 编写Application.mk

该文件定义了哪种平台的so文件,进入jni文件夹,创建Application.mk文件,写入内容:

APP_ABI := all

将生成四种平台的so文件:armeabi-v7a armeabi x86 mips

使用ndk-build指令生成so文件时候,可以通过传递参数,例子如下:ndk-build APP_ABI = armeabi-v7a ,单独生成某一个平台so文件,当然也可以直接在文件中修改


4 创建Android.mk文件

LOCAL_PATH := $(call my-dir)


include $(CLEAR_VARS)

LOCAL_C_INCLUDES := $(LOCAL_PATH)

LOCAL_MODULE    := libsearch

LOCAL_SRC_FILES := cn_search_poiresolver.cpp


include $(BUILD_SHARED_LIBRARY)


注意

    对于动态注册的方式,函数的参数列表前面两个参数是固定的:

static void SetSystemParameter(int paramType, int paramValue)

{

}


目前一段时间没有写jni接口,因此例如上面的函数定义是错误的,在调用该函数的时候,会发现传递进来的参数都是错误的,是一个非常庞大的数据,因此怀疑其实传递进来的其实是一个指针值!!

正确

static void SetSystemParameter(JNIEnv* env, jobject obj, jint paramType, jint paramValue)

{

}



     本文转自fengyuzaitu 51CTO博客,原文链接:http://blog.51cto.com/fengyuzaitu/1580781,如需转载请自行联系原作者




相关文章
|
API PHP 开发者
大麦网 API 接口商品详情信息 API
为了让更多用户了解到大麦网的商品详情,并能够方便地获取相关信息,大麦网推出了商品详情 API 接口。本文将介绍大麦网商品详情 API 接口的作用、使用方法和注意事项,帮助广大开发者更加方便地接入大麦网的产品。
|
Java Linux iOS开发
Linux下安装并配置Gradle
Linux下安装并配置Gradle
633 1
|
Java Linux 程序员
Linux 下 JNA 调用动态连接库文件 so
Linux 下 JNA 调用动态连接库文件 so
576 0
|
Java API 开发者
如何在Spring Boot中使用GraphQL
如何在Spring Boot中使用GraphQL
|
存储 算法 Java
性能优化:Java垃圾回收机制深度解析 - 让你的应用飞起来!
Java垃圾回收自动管理内存,防止泄漏,提升性能。GC分为标记-清除、复制、标记-整理和分代收集等算法。JVM内存分为堆、方法区等区域。常见垃圾回收器有Serial、Parallel、CMS和G1。调优涉及选择合适的GC、调整内存大小和使用参数。了解和优化GC能提升应用性能。
267 3
|
设计模式 前端开发 安全
理解最常用的MVC分层模型及其变种
【6月更文挑战第24天】 本文介绍架构模式如MVC、MVVM和MVP是解决软件结构问题的通用方案。。每种模式有其优缺点,适用场景不同。
729 0
理解最常用的MVC分层模型及其变种
|
Java 数据库
SpringBoot整合es7.x启动报错:Rejecting mapping update to [AAA] as the final mapping would have more than 1
SpringBoot整合es7.x启动报错:Rejecting mapping update to [AAA] as the final mapping would have more than 1
335 1
|
程序员 Windows
程序员必备技能:一键创建windows 服务
该内容是关于在Windows上创建服务的教程。通过一个BAT脚本示例,用户可以将程序设置为开机启动或持续运行的服务。脚本设置了服务名称、显示名和描述,并指定了程序路径和参数。将代码保存为.bat文件,以管理员权限运行,即可创建服务。之后在Windows服务管理中找到并启动该服务。
342 4
|
开发框架 .NET API
.NET 体系概览图集 - 2024 最全总结
.NET Core 是一个免费、跨平台、开源的开发平台,用于一站式构建不同类型的应用程序。 .NET Core 是以 .NET Framework 为基础,但是经过重新设计、实现的的新一代框架,实现了原 .NET Framework 中的几乎所有功能,核心特点就是开源、跨平台。
677 0
.NET 体系概览图集 - 2024 最全总结
|
人工智能 Java 物联网
Java未来发展前景
【4月更文挑战第13天】Java未来发展前景
446 8