android 浅尝JNI 打包so库
2017-09-14 15:16
148 查看
接触安卓有一段时间了,一直没有时间或者说自己没有主动去练习一些jni,今天就来分享一下jni的过程、步骤
我用的环境是studio jdk1.8
1:下载ndk 地址自行百度 安装完成后配置环境变量
2:AS新建一个项目,然后打开设置 配置一下ndk路径
然后配置一下gradle文件 如图
3: 这时候开始编写代码了,如下图
不擅长文字描述,多用图片,大家别介意,重点来了:
4: 命令行进入刚才编写的NativeTest文件路径 javac 类名.java生成javac文件 如图:
然后开始编译生成.h头文件 javah 包名.类名看下图 注意命令行目录位置:
5:有了头文件 接下来要创建jni目录 编写c代码了 步骤 如图:
直接点finish就好 然后复制刚才的.h头文件到这个目录里面 如图:
这时候创建一个.c文件 开始编写c代码了 如图:
好了 开始编写c代码 在刚刚创建的.c文件编写 先引入.h头文件:
下一步 重写.h头文件的方法:
配置一下等下要生成的so名字 架构:
接下来 在刚才的cpp目录 创建 Android.mk文件 用于编写so的一些配置:
还有一个Application.mk文件:
重点来了;开始打包so库
7: 命令如下图:
大功完成99,还差最后一点点 注释掉刚才build里的这几句话 删除也可以:
然后在项目的main目录新建一个jniLibs目录 拷贝libs里的全部架构进去,删除libs obj jni目录文件 当然,你喜欢 也可以复制到其他地方保存
最后一步了 我们回到一开始编写的NativeTest.java类里面 初始化一下我们打包的so库:
然后可以去调用这个类的方法了 :
好了,本文到这里结束了,希望大家喜欢;
ps:在.c里面返回字符串的时候 使用这个NewStringUTF 请注意,如果你在java里传过去的是字符串 ,请别用NewStringUTF 进行编码 会报错,解决方法两个 1:不使用NewStringUTF ,原样返回值,2 :对传过来的java字符串进行转码,比较麻烦,自行百度。如有疑问请邮件留言 1668126018@qq.com
我用的环境是studio jdk1.8
1:下载ndk 地址自行百度 安装完成后配置环境变量
2:AS新建一个项目,然后打开设置 配置一下ndk路径
然后配置一下gradle文件 如图
3: 这时候开始编写代码了,如下图
不擅长文字描述,多用图片,大家别介意,重点来了:
4: 命令行进入刚才编写的NativeTest文件路径 javac 类名.java生成javac文件 如图:
然后开始编译生成.h头文件 javah 包名.类名看下图 注意命令行目录位置:
5:有了头文件 接下来要创建jni目录 编写c代码了 步骤 如图:
直接点finish就好 然后复制刚才的.h头文件到这个目录里面 如图:
这时候创建一个.c文件 开始编写c代码了 如图:
好了 开始编写c代码 在刚刚创建的.c文件编写 先引入.h头文件:
#include <com_ndktest_NativeTest.h>`
下一步 重写.h头文件的方法:
// // Created by Administrator on 2017/9/14 0014. // #include <com_ndktest_NativeTest.h> JNIEXPORT jstring JNICALL Java_com_ndktest_NativeTest_getHint (JNIEnv *env, jclass obj){ return (*env)->NewStringUTF(env,"简单的方法返回值 ,不传参数"); } JNIEXPORT jstring JNICALL Java_com_ndktest_NativeTest_getToastInfo (JNIEnv *env, jclass o, jstring s){ return s; }
配置一下等下要生成的so名字 架构:
接下来 在刚才的cpp目录 创建 Android.mk文件 用于编写so的一些配置:
还有一个Application.mk文件:
重点来了;开始打包so库
7: 命令如下图:
大功完成99,还差最后一点点 注释掉刚才build里的这几句话 删除也可以:
ndk { moduleName "test"//指定生成的so文件名 abiFilters "armeabi", "armeabi-v7a", "x86"//cpu的类型 } sourceSets.main { jni.srcDirs = ['libs'] }
然后在项目的main目录新建一个jniLibs目录 拷贝libs里的全部架构进去,删除libs obj jni目录文件 当然,你喜欢 也可以复制到其他地方保存
最后一步了 我们回到一开始编写的NativeTest.java类里面 初始化一下我们打包的so库:
package com.ndktest; public class NativeTest { static { System.loadLibrary("test"); } public static native String getHint(); public static native String getToastInfo(String values); }
然后可以去调用这个类的方法了 :
package com.ndktest; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.util.Log; import android.util.Xml; import android.widget.Toast; public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Toast.makeText(this, "jni返回的提示:" + NativeTest.getHint() + " 传过去的参数: " + NativeTest.getToastInfo("sdadasda"), Toast.LENGTH_SHORT).show(); Log.e("jni返回的提示",NativeTest.getHint()); Log.e("传过去的参数",NativeTest.getToastInfo("sdadasda")); } }
好了,本文到这里结束了,希望大家喜欢;
ps:在.c里面返回字符串的时候 使用这个NewStringUTF 请注意,如果你在java里传过去的是字符串 ,请别用NewStringUTF 进行编码 会报错,解决方法两个 1:不使用NewStringUTF ,原样返回值,2 :对传过来的java字符串进行转码,比较麻烦,自行百度。如有疑问请邮件留言 1668126018@qq.com
相关文章推荐
- android-jni 总结系列 -- so库打包给别的工程用
- JNI使用实例:Android Studio使用JNI编译so库
- Android使用JNI调用C/C++生成的.so库的流程(功能:apk卸载时调用web页面)
- 如何将java打包成jar, 如何将JNI的.so库和jar添加到应用APK中
- Android平台实现JNI链接第三方.so库到armeabi文件夹中
- Xamarin Android 绑定jar库同时将so库打包进去
- Android Studio NDK jni 开发生成头文件和加载so库
- android中JNI利用第三方的so库
- Android使用已有so库自己实现jni封装
- AndroidStudio打包.so库
- Android Studio JNI 开发.so库
- android在JNI_OnLoad入口函数下断点动态调试so库
- android Jni编译多平台so库
- Android JNI打包so文件到apk
- android中用ndk编译c代码为so库,供jni调用(一)
- Mac 下Android Studio JNI 制作so库
- Android.mk打包 so库 & jar包
- Android Stuido Ndk-Jni 开发(四)Jni打包及引用aar
- Android NDK——配置NDK及使用Android studio开发Hello JNI并简单打包so库
- Android Jni调用so库,加载库失败分析