JNA(Java Native Access )提供一组Java工具类用于在运行期动态访问系统本地库(native library:如Window的dll)而不需要编写任何Native/JNI代码。开发人员只要在一个
java接口中描述目标native library的函数与结构,JNA将自动实现Java接口到native function的映射。
优点
JNA可以让你像调用一般java方法一样直接调用本地方法。就和直接执行本地方法差不多,而且调用本地方法还不用额外的其他处理或者配置什么的,也不需要多余的引用或者编码,使用很方便。
JNA描述
JNA类库使用一个很小的本地类库sub 动态的调用
本地代码。程序员只需要使用一个特定的
java接口描述一下将要调用的本地代码的方法的结构和一些基本属性。这样就省了为了适配多个平台而大量的配置和编译代码。因为调用的都是JNA提供的公用jar 包中的接口。
JNA是为了程序员调用本地代码更方便,跑的更快以及减少出错。
JNA中还包括了一些已经和某些特定平台的常用方法映射好的接口以及一些有用的可以简化
本地代码访问的方法。
编译过程如:
好吧 上面是百度百科里面使用的, 那么我之前的项目5.0之前使用了JNA, 然后在5.0以后的手机上就会直接闪退。而我还不知道,我只知道我的app量越来越低,差评越来越多。
今天终于把坑填好了。为什么会错呢 是因为JNA版本太老,还有其他的库都用最新的NDK重新编译了一次 搞定 没问题了。
编译过程:
Android Development Environment
Add Android SDK/NDK tools into PATH (used by native/Makefile).
Set environment variable NDK_PLATFORM (used by native/Makefile).
Build using: ant -Dos.prefix=android-arm dist.
编译出来的文件在dist里面,而我只需要把dist里面的android-arm.jar, android-armv7.jar解压,提取其中的libjnidispach.so文件分别放入android的libs下的对应文件夹, 然后一定记住在需要使用的类里面写上
static {
System.loadLibrary("jnidispatch");
}
然后在dist里面找到jna,jar 用压缩软件打开 把里面所有的包含.so的文件夹删除,然后把剩下的jna.jar放入libs文件夹, 搞定。
使用超级简单,只需要调用C/C++里面写得方法名称就好 对应 就会自动帮你映射
import com.sun.jna.Library;
import com.sun.jna.Native;
import com.sun.jna.WString;
public interface Player extends Library{
Player INSTANCE = (Player)Native
.loadLibrary("player", Player.class);
/**
*
* @param type
* @param argc
* @param argv
* @param pathin
* @param pathout
*/
public int covert(String type, int argc, String argv[], String pathin, String pathout);
public int mixer(int argc, String []argv);
}
好了, 睡觉。。。