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");
//.c
typedef 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中。