您当前的位置:首页 > 互联网教程

android jni 使用第三方提供的.so库及所对应的jar包

发布时间:2025-05-22 06:59:44    发布人:远客网络

android jni 使用第三方提供的.so库及所对应的jar包

一、android jni 使用第三方提供的.so库及所对应的jar包

1.将SO文件直接放到libs/armeabi下,然后代码中System.loadLibrary("xxx");再public native static int xxx_xxx_xxx();接下来就可以直接调用xxx_xxx_xxx()方法;

2.第二种方案,创建自己的SO文件,在自己的SO文件里调用第三方SO,再在程序中调用自己的SO,这种比较复杂,需要建java类文件,生成.h文件,编写C源文件include之前生成的.h文件并实现相应方法,最后用android NDK开发包中的ndk-build脚本生成对应的.so共享库。

2. DEX加壳保护,DEX指令动态加载保护和高级源码混淆保护。其中DEX加壳保护是“爱加密”主推的卖点,该技术通过将DEX文件隐藏,并生成一个类似于虚像的壳文件,阻止黑客利用反编译工具获取App源码。另外,爱加密推出了so库保护,使得C/C++层面的代码安全也得到防护。加上资源文件保护(图片、音频等文件的防查看和防修改)、xml主配文件保护(对主配文件进行二次签名)、内存保护等措施,可以基本保证App的动态和静态安全。

二、如何在android的jni线程中实现回调

1、如果是C/C++回调,你只要参考linux的线程指南,在线程函数中传入回调函数地址就行了。如果是要回调到Java层,稍微复杂点。

2、首先,你需要在onload的时候,找到回调函数所在的类,用全局变量保存:

3、JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM*vm, void*reserved)

4、 version= vm->GetEnv((void**)&env, JNI_VERSION_1_2);

5、 g_clazz= env->FindClass(CLASS_CustomSurfaceView);//全局变量保存

6、 LOGE("JNI_OnLoad finish g_clazz= 0x%x", g_clazz);

7、在JNI启动线程的时候,需要把线程挂到JVM上,不然不能访问Java。你有了g_vm, g_clazz,以及env,就可以做回调操作了。

8、 int ret= g_vm->AttachCurrentThread((JNIEnv**)&env, MNull);//挂到JVM

9、g_vm->DetachCurrentThread();//从JVM卸载

10、记得好评和采纳,答题不易,互相帮助,

三、如何在Android中启动JAVA程序

1、在Android中启动JAVA程序其实有很多种方式,现总结如下

2、一、在Android应用程序中发送Intent启动Android应用程序

3、这个方式最简单,最常用。在此不在累述。关于Intent的更多内容请阅读《Intent技术简介》

4、二、在shell控制台通过am命令发送Intent来启动Android应用程序

5、在Android的shell控制台通过am命令发送Intent来启动Android应用程序

6、关于此的详细内容请参考《Android命令am详解》

7、三、在shell控制台直接通过davlikvm命令启动一个JAVA程序。

8、该方式有个天生的缺点,即在其中,很多Android的JNI无法调用。因为Android的很多JNI其实是需要手动注册的。

9、关于请参考《基本Dalvik VM调用》

10、四、在shell控制台直接通过运行app_process程序启动一个JAVA程序

11、在app_process程序中,他会对Android的JNI进行手动注册的,能很好的使用Android的API,因此通过运行app_process程序启动一个JAVA程序,是一个比较完美的方式。app_process程序是一个C程序,它的源码位于frameworks\base\cmds\app_process。

12、关于它的使用请参考《Android命令am详解》以及shell脚本frameworks\base\cmds\am\am和frameworks\base\cmds\pm\pm

13、# Script to start"am" on the device, which has a very rudimentary# shell.#base=/systemexport CLASSPATH=$base/framework/am.jarexec app_process$base/bin com.android.commands.am.Am"$@"pm脚本文件如下:

14、# Script to start"pm" on the device, which has a very rudimentary# shell.#base=/systemexport CLASSPATH=$base/framework/pm.jarexec app_process$base/bin com.android.commands.pm.Pm"$@"CLASSPATH指定了你的程序的位置,com.android.commands.pm.Pm则说明了程序的入口为com.android.commands.pm.Pm,即入口函数main()所在的类,"$@"就是传递给main()函数的参数,只是这里"$@"本身又是个shell传入的参数而已

15、需要注意的是CLASSPATH中的文件必须是dalvik文件格式的,关于此的转换请参考《基本Dalvik VM调用》当然CLASSPATH中的文件可以是apk文件,只是你的apk中至少应该有个拥有main()入口函数的类。