JNI 1

来源:互联网 发布:ceic数据库与wind 编辑:程序博客网 时间:2024/06/05 16:14

1,项目->AndroidTool ->AddNativeSupport ->.so名
2,修改jni/Android.mk文件, 注意把cpp,改为c,
3,新建一个java类,并且定义native函数,并且

package com.tfsc;public class TFSCSample {    private native int sdTest();    public final int TFSCsdTest(){        return sdTest();    }    static    {        System.loadLibrary("TFSCa");    }}

4,Javah 包.类名 在bin\classes目录生成对应的.h文件,拷贝.h文件中的函数声明到jni/xxx.c文件中即可,

PS: adb push c程序到手机运行
1,把android.mk中的修改为可执行程序

2,cmd进入项目目录,
ndk-build需要在项目目录进行,不能在jni目录,
否则eclipse会不刷新生成的.so库
ndk-build clean
ndk-build
adb push lib\armeabi\xxx /data/local/tmp/
adb shell
cd /data/local/tmp/
chmod 777 xxx
./xxx

PS:分清动态库和静态库,
安卓,即linux上,.so为动态库,.a为静态库,
一般库代码少就放到静态库里面。
静态库的加载方式如下:
见图

动态库的加载方式如下

//动态加载SKF库,描述代码//.java skfTest.LoadSKF("/data/data/com.SKFDemo/lib/libSKFInterface.so");//.ctypedef ULONG (DEVAPI *pSKF_SetPackageName)(LPSTR pszPackageName);pSKF_SetPackageName Fun_SKF_SetPackageName = NULL;g_hSKFLib = dlopen(pszSKFName, RTLD_NOW);//(dkopen打开动态库,需要#include <dlfcn.h>,函数返回句柄)//pszSKFName即是"/data/data/com.SKFDemo/lib/libSKFInterface.so"if (NULL == g_hSKFLib)goto EndOP;// Android4.4 需要设置包名    Fun_SKF_SetPackageName = (pSKF_SetPackageName)dlsym(g_hSKFLib, "SKF_SetPackageName");//赋值if ( NULL == Fun_SKF_SetPackageName)goto EndOP;ulRet = Fun_SKF_SetPackageName(pszPackageName);//使用

windows版本:
1,显示声明.h和lib

#include "xxx.h"#pragma comment(lib, "xxx.lib");

2,隐式包含 .lib放到项目属性->链接器->输入->附加依赖项
.h 项目属性->c/c++->常规->附加包含目录

PS:编译时需要lib即可,调试或者运行时需要把dll放到对应的Debug,或Release中。

0 0
原创粉丝点击