吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 7848|回复: 17
收起左侧

[Android 原创] AndroidSturio编写so教程

  [复制链接]
编草鞋的蚂蚱 发表于 2017-11-4 10:10
本帖最后由 编草鞋的蚂蚱 于 2017-12-17 11:08 编辑

这篇教程将会教你如何编写一个.so文件
一、打开android stdio新建项目。
二、新建一个类,声明native方法。
这个类是java与C/C++交互的中介,方法由java声明,由C/C++实现。
不在Activity类里面写是为了避免编译时报错。
代码:
public class myJNI {
static {
System.loadLibrary("jinTest");
}
//native方法
public static native String huxu();
}


三、生成class文件
001.png
在Terminal框内输入javac命令。
命令:E:\AndroidStudio\huxu\TextJNI005\app\src\main\java\com\example1\admin\textjni005>javac myJNI.java
在这里,要说明一下,不然的话,很多人会容易卡在这里。
输入命令是,应该是先输入 cd 然后再输入E:\AndroidStudio\huxu\TextJNI005\app\src\main\java\com\example1\admin\textjni005找到文件位置。
之后再输入javac myJNI.java
即: 002.png
就生成了.class
在Terminal框内后面的命令符看不到,我也不知道为什么。(请路过大神指教)


我的myJNI.class在E:\AndroidStudio\huxu\TextJNI005\app\src\main\java\com\example1\admin\textjni005
我的包名是:package com.example1.admin.textjni005;
所以我的javah命令应该这么写:E:\AndroidStudio\huxu\TextJNI005\app\src\main\java>javah -jni com.example1.admin.textjni005.myJNI
具体步骤:输入cd  E:\AndroidStudio\huxu\TextJNI005\app\src\main\java   然后再输入:javah -jni com.example1.admin.textjni005.myJNI


003.png
然后就能看到生成了一个h文件


四、在main下新建一个jni文件夹。然后新建main.c
004.png
005.png
找到生成的.h文件
006.png
五、修改代码
把.h里面的内容
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_example1_admin_textjni005_myJNI */


#ifndef _Included_com_example1_admin_textjni005_myJNI
#define _Included_com_example1_admin_textjni005_myJNI
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: com_example1_admin_textjni005_myJNI
* Method: huxu
* Signature: ()Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_com_example1_admin_textjni005_myJNI_huxu
(JNIEnv *, jclass);


#ifdef __cplusplus
}
#endif
#endif
把.h里面的内容复制到新建的main.c中去,并实现里面的函数。
修改后的main.c
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_example1_admin_textjni005_myJNI */


#ifndef _Included_com_example1_admin_textjni005_myJNI
#define _Included_com_example1_admin_textjni005_myJNI
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: com_example1_admin_textjni005_myJNI
* Method: huxu
* Signature: ()Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_com_example1_admin_textjni005_myJNI_huxu
(JNIEnv *env, jclass jobj){
return (*env)->NewStringUTF(env,"JNI 52pojie");


}


#ifdef __cplusplus
}
#endif
#endif


在jni文件夹下添加一个空白的util.c文件。我看的教程上是这样的,不新建会报错,我也不知道为什么。




六、配置NDK
local.properties文件添加NDK路径


007.png


七、加载之前自己编写的类里的so库名
打开app Module的build.gradle文件,在defaultConfig节点里(注意这里的moduleName)
添加以下代码:


ndk {
moduleName "JniTest"
ldLibs "log", "z", "m"
abiFilters "armeabi", "armeabi-v7a", "x86"
}




008.png


八、在gradle.properties里面添加语句:
android.useDeprecatedNdk=true
即:
009.png
生成SO
010.png


找到生成的SO
011.png
九、在src\main下新建文件夹jniLIB




把生成的SO文件拷到新建文件夹jniLIB下



十、使用JNI
上面我们用native方法声明成了静态的方法,所以在Activity里面直接调用myJNI类就行


public class MainActivity extends AppCompatActivity {
TextView t1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
t1 = (TextView) findViewById(R.id.T1);
t1.setText(myJNI.huxu());


}
}


这里要记得Rebuild一下,不然会报错。


11111.png
然后就运行呗。


013.png
OK 了!















012.png

免费评分

参与人数 1吾爱币 +1 热心值 +1 收起 理由
qwerttqqaz + 1 + 1 我很赞同!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

Tim-52Pojie 发表于 2017-11-5 07:23
一脸懵逼,话说回来好像有一个Bug,在static里面写的是"Jintest",为什么在后面写的是"Jnitest"可以编译成功呢?我用AS老是认不了NDK,换Eclipse后又折腾了一段时间才做出来了我的SO,结果,,,,闪退---试试LZ得把,现在我要重装AS,Android SDK.NDK,我知道我的C盘空间会减少很多#滑稽
 楼主| 编草鞋的蚂蚱 发表于 2017-11-7 21:34
Tim-52Pojie 发表于 2017-11-5 07:23
一脸懵逼,话说回来好像有一个Bug,在static里面写的是"Jintest",为什么在后面写的是"Jnitest"可以编译成功呢 ...

手滑了一下
Hunjun 发表于 2017-11-4 10:18 来自手机
感谢分享经验,诶,看完之后又要百度一大堆东西,
夏雨微凉 发表于 2017-11-4 12:29
好复杂。。。
lghlth 发表于 2017-11-4 13:43
谢谢分享辛苦了
obediently 发表于 2017-11-4 15:59
感谢分享,不错
吾爱豆腐渣 发表于 2017-11-4 17:35
一脸懵逼。。。
love.xx 发表于 2017-11-4 18:27
不明觉厉
a1069517910 发表于 2017-11-4 20:52
感谢楼主分享!!
yanglq 发表于 2017-11-4 22:27
谢谢大神的分享
微笑男孩 发表于 2017-11-4 22:52
感谢楼主分享
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-24 21:59

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表