目标
根据项目的需求,我们用纯c实现的模块,需要移植到android设备中,制作java版本的sdk,我们需要用到jni和ndk。
下面用实例一步一步介绍这个过程。目标如下:
c源接口
java目标接口
#include
#include
#include
#ifndef USER_H
#define USER_H
/**
* 数字加法
*/
int my_fun1(int a,int b);
/**
* 连接字符串
*/
char* my_fun2(char *s1, char *s2);
#endif // USER_H
/**
* 整数加法
* @param a
* @param b
* @return int
*/
public static int myFun1(int a, int b) {}
/**
* 字符串拼接
* @param a
* @param b
* @return String
*/
public static String myFun2(String a, String b) {}
第一阶段:ndk项目内联合调试
1.1、建立一个项目MySdkDemo
这里建立的一个MainActivity是用来做项目内调试的
1.2、在MySdkDemo内建立一个模块MySdkLibrary
这个module就是用来制作aar包和so库的,其中MySdk就是对外的接口的类名
1.3、在MySdkLibrary建立一个类MySdk,编写native方法,并生成jni头文件
为什么要写native,为什么要写jni头文件,这里不展开,请参考附后的参考文章。
其实jni头文件可以自己编写,当时java和c的对应规则比较变态,建议用javah命令生成
在包 com.dqz.www.mysdklibrary中建立类文件MySdk,代码如下,
package com.dqz.www.mysdklibrary;
/**
* Created by 等钱中 on 16/7/29.
*/
public class MySdk {
/**
* 整数加法
*
* @param a
* @param b
* @return int
*/
public native int fun1(int a, int b);
/**
* 字符串拼接
*
* @param a
* @param b
* @return String
*/
public native String fun2(String a, String b);
}
以上代码并不是最终代码,是用来生成jni头文件用的
转到命令行窗口,执行javah
King-4:java dengqianzhong$ cd mysdklibrary/src/main/java
King-4:java dengqianzhong$ javah com.dqz.www.mysdklibrary.MySdk
这时候,你会看见包根目录下多了一个com_dqz_www_mysdklibrary_MySdk.h头文件,
方法名字很长吧,不要怕,反正还有更长的,你也不用修改它。它的代码如下:
/* DO NOT EDIT THIS FILE - it is machine generated */
#include
/* Header for class com_dqz_www_mysdklibrary_MySdk */
#ifndef _Included_com_dqz_www_mysdklibrary_MySdk
#define _Included_com_dqz_www_mysdklibrary_MySdk
#ifdef __cplusplus
extern