JNI 详细使用步骤 上手示例

使用步骤


一、定义本地方法,通常情况下,应单独定义一个类来封装所有native方法
/** 存放native方法的类 */ public class MyNativeMethods {     private static MyNativeMethods mEmployee;     private MyNativeMethods() {     }     public static MyNativeMethods getInstance() {         if (mEmployee == null) {             mEmployee = new MyNativeMethods();         }         return mEmployee;     }     //相当于在java代码中定义了一个接口,然后用C语言实现了此接口     public native String helloFromC();     public native int passwordFromC(int x, int y); }
二、在项目根目录下创建【jni文件夹】,在jni文件夹中创建一个【.c文件】,在c代码中,实现上面定义的方法
#include <stdio.h> #include <stdlib.h> #include <jni.h>//必须添加的头文件 jstring Java_com_bqt_hellofromc_MyNativeMethods_helloFromC(JNIEnv* env, jobject obj) { //【返回值】【方法名】【参数列表】返回值类型jstring就是java中的string     char* cstr = "hello from c"; //  char*  在c中可用来表示一个字符串。注意,这里绝对不能有中文     jstring jstr = (*env)->NewStringUTF(env, cstr);     return jstr; } JNIEXPORT jint JNICALL Java_com_bqt_hellofromc_MyNativeMethods_passwordFromC(JNIEnv *env, jobject obj, jint a, jint b) {     return a + b + 10000; //c中的int占用字节数在不同环境下可能不同,可能是0-65535,所以,稍微大一点的数(十万级别)都得用double }
三、把C/C++代码编译成【动态链接库.so文件】 1、在工程的jni目录下创建一个【Android.mk文件】,在里面定义打包成函数【库的名字】及对应的【c代码的文件名】
LOCAL_PATH := $(call my-dir) # C/C++代码所在目录,也就是我们的jni目录,不必修改 include $(CLEAR_VARS) LOCAL_MODULE    := hello # 对应打包成函数库的名字,编译器会自动在前面加上lib,在后面加上.so,最终结果就是libhello.so LOCAL_SRC_FILES := hello.c # 对应的c代码的文件名,即hello.c   include $(BUILD_SHARED_LIBRARY)
2、使用工具编译生成动态链接库.so文件 可以使用cygwin工具编译,其中第三步中为Android工程的根目录
cd ../.. cd cygdrive/ cd d/Users/Android_workspace/HelloFromC ndk-build
或直接用cmd编译,注意要先在系统变量path中增加NDK工具所在路径,如【D:\Android\android-ndk-r10d】
cd/d D:\Users\Android_workspace\HelloFromC ndk-build
过程: 编译成功后会在工程libs/armeabi目录下生成一个【libhello.so】文件 PS,EABI的含义为:Embedded Application Binary Interface(嵌入式应用二进制接口) 3、若要项目支持arm外的平台,需在jni目录中添加【Application.mk】文件,并加上以下内容
APP_ABI := armeabi armeabi-v7a x86 #Application.mk文件的目的是,描述在你的应用程序中所有需要的模块(即静态库或动态库) #APP_ABI 的值以空格区分,代表要支持的架构,默认值为【armeabi】。其他架构,ARMv7 【armeabi-v7a】;IA-32【 x86】 #每增加一个架构,编译后都会在lib目录下生成一个相应的文件夹,文件夹下的文件都是同名的.so文件(当然文件内容不一样)
编译成功后,会在lib目录下生成对应的多个文件夹及.so文件 4、细心观察会发现,除了自动生成了libs目录下的.so文件外,还产生了一个比libs目录大很多倍的obj目录,并且其结构及内容也很像 网上找到的资料解释为: As part of the build process过程, the files in the libs folder have been stripped剥皮 of symbols符号 and debugging information. So you‘ll want to keep two copies of each of your .so files: One from the libs folder to install on the Android device, and one from the obj folder to install for GDB一个调试工具 to get symbols from. 简单来说就是,obj下的是带符号和调试信息的,lib下的是去掉这些庞大信息后的动态链接库文件,在安装到Android设备上时只需libs目录下的.so文件即可 5、当完成这一步后,如果我们以后不需要再重新编译,我们就可以直接删除jni目录和obj目录了 四、在java代码中加载.so类库,之后就可以调用本地方法了
static {         System.loadLibrary("hello");// 在java代码中引入libs目录下的库函数,文件名为【libhello.so】。注意,引入时的文件名要去掉前面的lib和后面的.so         }     String stringFromC = MyNativeMethods.getInstance().helloFromC();    int intFromC = MyNativeMethods.getInstance().passwordFromC(1, 2);  
以上测试完美通过

来自为知笔记(Wiz)

附件列表

时间: 2024-10-06 03:07:15

JNI 详细使用步骤 上手示例的相关文章

iOS数据库操作之coredata详细操作步骤

CHENYILONG Blog iOS数据库操作之coredata详细操作步骤 技术博客http://www.cnblogs.com/ChenYilong/ 新浪微博http://weibo.com/luohanchenyilong iOS应用数据存取的常用方式 ? XML属性列表 -- PList? NSKeyedArchiver 归档 ?Preference(偏好设置) ? SQLite3? Core DataCore Data简介 ? Core Data 是iOS SDK 里的一个很强大的

伯努利分布详解(包含该分布数字特征的详细推导步骤)

Bernouli Distribution(中文翻译称伯努利分布) 该分布研究的是一种特殊的实验,这种实验只有两个结果要么成功要么失败,且每次实验是独立的并每次实验都有固定的成功概率p. 概率公式可以表示为  , x只能为0或者1,即要么成功要么失败 根据数学期望的性质 由于这里x只有两个取值所以该分布的数学期望为 方差则可以由方差公式来计算 方差公式:  该分布显然, 因此可以得到, 所以方差  最后我们来推导该分布的最大似然估计 是这样定义的,假设我们做了N次实验,得到的结果集合为 ,我们想

HBase的多节点集群详细启动步骤(3或5节点)(分为Zookeeper自带还是外装)

HBase的多节点集群详细启动步骤(3或5节点)分为: 1.HBASE_MANAGES_ZK的默认值是false(zookeeper外装)(推荐) 2.HBASE_MANAGES_ZK的默认值是true(zookeeper自带) 1.HBASE_MANAGES_ZK的默认值是false(推荐) 伪分布模式下,如(weekend110) hbase-env.sh配置文档中的HBASE_MANAGES_ZK的默认值是true,它表示HBase使用自身自带的Zookeeper实例.但是,该实例只能为单

LAMP----linux+apache+mysql+php详细安装步骤之一APACHE篇(openldap等)

LAMP----linux+apache+mysql+php详细安装步骤之一APACHE篇(openldap等) linux详细版本为RHEL5.3 [[email protected] mail]# uname -a Linux localhost.localdomain 2.6.18-128.el5 #1 SMP Wed Dec 17 11:42:39 EST 2008 i686 i686 i386 GNU/Linux 1.上传apache源代码文件 httpd-2.2.13.tar.bz2

C++使用SQLite步骤及示例

C++使用SQLite步骤及示例开发环境:Windows 10+VS2013. 开发语言:C++.   1. 下载sqlite文件. 下载网址:http://www.sqlite.org/download.html. SQLite版本为SQLite 3.11.1,相关文件如下.sqlite-dll-win32-x86-3110100.zip:包含sqlite3.def.sqlite3.dll文件.sqlite-amalgamation-3110100.zip:包含sqlite3.h 文件.sql

win10电脑中彻底禁止金山毒霸手机助手启动的详细的步骤

我们在win10系统的使用中,有小伙伴在金山毒霸的使用出现了问题,我们都知道在电脑上安装金山毒霸的时候系统也会直接的安装使用金山毒霸的手机助手,这对我们咯爱说很是烦人,手机助手会一直的打开,今天小编就来跟大家分享一下win10电脑中彻底禁止金山毒霸手机助手启动的详细的步骤. 具体的方法和详细的步骤如下: 1.首先打开金山毒霸软件,界面如图,点击图中的按钮. 2.弹出一个下拉窗口,点击设置. 3.进入设置后,弹出新的窗口,在左下方点击实用工具. 4.在中间看到手机助手了,点击它就可以看到关于手机助

科研及工程实践中光纤涂覆机详细操作步骤(图文)

科研及工程实践中光纤涂覆机详细操作步骤(图文)一.清洁涂覆夹具涂覆夹具包括上.下两片光滑的石英片,每片的中间有一个半圆形槽,为了使上下两石英片扣和形成完美的圆形腔,需要清洁附着在石英片表面的灰尘,可以使用无尘纸沾酒精来清洗.用沾有酒精的无尘纸轻轻擦拭石英片,擦拭时候注意从一边单向擦拭,切勿来回擦拭(来回擦拭擦不干净,同时容易损伤石英表面镀金层),擦拭完毕后稍等残余酒精挥发或者用干的无尘纸再擦拭一遍后进行下一步操作.请注意:清洗时需轻轻擦拭,以防划伤石英片光滑表面 二.连接电源三.打开涂覆机电源开

FC 与 FB 与 OB 的区别,时间标记冲突与一致性检查 有详细的步骤

关键字1 组织块的程序是由用户自己编写. 关键字2 时间标记冲突与一致性检查 有详细的步骤. 关键字3 FC 与 FB 与 OB 的区别? ? (一)功能 功能块 区别 ? FB 和FC均为 用户编写的程序.在他们的变量声明表中均有 IN OUT IN_OUT 和temp 变量 . FC的返回值 Ret_Val 实际上属于输出参数. ? 下面是FC与FB的区别: 功能块有背景数据块,功能被哟背景数据块.只能在功能内访问功能的局部变量. 其它逻辑块可以访问背景数据块中的变量. (2)功能没有静态变

源码方式向openssl中添加新算法完整详细步骤(示例:摘要算法SM3)【非engine方式】

openssl简介 openssl是一个功能丰富且自包含的开源安全工具箱.它提供的主要功能有:SSL协议实现(包括SSLv2.SSLv3和TLSv1).大量软算法(对称/非对称/摘要).大数运算.非对称算法密钥生成.ASN.1编解码库.证书请求(PKCS10)编解码.数字证书编解码.CRL编解码.OCSP协议.数字证书验证.PKCS7标准实现和PKCS12个人数字证书格式实现等功能. openssl采用C语言作为开发语言,这使得它具有优秀的跨平台性能.openssl支持Linux.UNIX.wi