1、在jni目录下新目录prebuilt,在此目录下新文件Androidusc.mk(名字随便取),将第三方库.so复制到此目录
2、打开Androidusc.mk添加内容,例如第三方库是libScreenPop.so:
LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := ScreenPop LOCAL_SRC_FILES := libScreenPop.so include $(PREBUILT_SHARED_LIBRARY)
3、修改jni目录下的Android.mk文件,加入一条语句:
include $(LOCAL_PATH)/prebuilt/Androidusc.mk
Clean工程,完成。
你在linux下写一个X86处理器的库,要在java里用,而且在arm处理器下。
是这意思吗?
已了解解决方案:
1.将SO文件直接放到libs/armeabi下,然后代码中System.loadLibrary("xxx");再publicnativestaticintxxx_xxx_xxx();接下来就可以直接调用xxx_xxx_xxx()方法;
2.第二种方案,创建自己的SO文件,在自己的SO文件里调用第三方SO,再在程序中调用自己的SO,这种比较复杂,需要建java类文件,生成.h文件,编写C源文件include之前生成的.h文件并实现相应方法,最后用androidNDK开发包中的ndk-build脚本生成对应的.so共享库;
求解:网上说的第二种方案,是自己引用so库,最后声称JAR------
解决方案:首先要看这个SO是不是JNI规范的SO,比如有没有返回JNI不直接支持的类型。也就是说这个SO是不是可以直接当作JNI来调用。如果答案是否定的,你只能选第二个方案。如果答案是肯定的,还要看你是不是希望这个SO的库直接暴露给JAVA层,如果答案是否定的,你只能选第二个方案,比如你本身也是一个库的提供者。一般如果你只有SO,就说明这个是别人提供给你的,你可以要求对方给你提供配套的JAVA调用文件。
1、这个要看这个SO是不是符合JNI调用的规范。还要看你自己的意愿。
2、因为第二种方法最灵活,各种情况都可以实现。
3、可以------
解决方案:看能不能直接从JAVA调用的最简单的方法就是看SO里的函数名是不是Java_XXX_XXX_XXX格式的是就可以,你可以自己写一个配套的JAVA文件,注意一下SO函数名和JAVA函数名的转换规则,或者向SO提供方索要;不是的话就选第二种方案吧。