JNI 1

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文件中即可,

12

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中。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值