JNI开发最详细最全入门

1 jni 开发使用 :
java native interface:

第一步 下载ndk :
可以上网搜 ,也可以用as里面的自带下载
第二步 写一个声明native 方法的类


public class JNIUtil {

    //加载so库
    static {
        System.loadLibrary("JniTest");
    }

   //native方法
    public static native String helloWorld();


}

第三步 生成class文件

打开android studio终端,

View ->ToolWindows-> Terminal

或者直接按alt+F12
使用javac编译上述文件,生成class文件:

D:\AndroidStudioProject\testJNI\app\src\main\java\com\xxx\jni>javac JNIUtil.java

在编译的过程中有可能出现找不到导入的类或者编码的过程 可以按以下格式写:

D:\xxx\xxx\xxx-xxx\app\src\main\java\com\music\xxx\jni>javac -encoding UTF-8  -classpath C:\Users\AppData\Local\Android\Sdk\platforms\android-25\android.jar JNIUtil.java
格式为 包名>   javac  -encoding UTF-8  -classpath  所导入的类的包   类名

点击run运行就会生成class文件

第四步: 生成.h文件

通过cd rd等命令 到
D:\co_project\xxx\xxx\app\src\main\java>

然后输入:
其中-encoding UTF-8 表示以UTF-8编译 否则可能会报错 因为编码是按系统默认编码
javah -jni -encoding UTF-8 com.music.xxx.util.JNIUtil

格式为com根目录下: javah -jni  - encoding UTF-8  

-classpath 要导入的类的目录;当前目录;包名+类名


D:\xxx\xxx\app\src\main\java>javah -jni -classpath C:\xxx\AppData\Local\Android\Sdk\platforms\android-25\android.jar;.; com.music.xxx.jni.JNIUtil

过程中如果碰到 编码问题 或者52比51 新升级编译器的问题不用管直接按运行 同样的会生成头文件

/*DONOTEDITTHISFILE-itismachinegenerated*/
#include<jni.h>
/*Headerforclasscom_music_xxx_util_JNIUtil*/

#ifndef_Included_com_music_xxx_util_JNIUtil
#define_Included_com_music_xxx_util_JNIUtil
#ifdef__cplusplus
extern"C"{
#endif
/*
*Class:com_music_gramophone_util_JNIUtil
*Method:helloWorld
*Signature:()Ljava/lang/String;
*/
JNIEXPORTchar*JNICALLJava_com_music_xxx_util_JNIUtil_helloWorld
(JNIEnv*,jclass);

#ifdef__cplusplus
}
#endif
#endif

第五步 java路径 新建JNI\main.c 拷贝 .h文件 并且实现里面的方法

/*DONOTEDITTHISFILE-itismachinegenerated*/
#include<jni.h>
/*Headerforclasscom_music_gramophone_util_JNIUtil*/

#ifndef_Included_com_music_gramophone_util_JNIUtil
#define_Included_com_music_gramophone_util_JNIUtil
#ifdef__cplusplus
extern"C"{
#endif
/*
*Class:com_music_gramophone_util_JNIUtil
*Method:sayHello
*Signature:()Ljava/lang/String;
*/
JNIEXPORTjstringJNICALLJava_com_music_gramophone_util_JNIUtil_helloWorld
(JNIEnv*env,jclassj)
{
return(*env)->NewStringUTF(env,"hello World");



}

#ifdef__cplusplus
}
#endif
#endif

JNIEnv 用法:
http://blog.csdn.net/freechao/article/details/7692239

第6步:
配置NDK
打开Project的local.properties文件添加NDK路径

ndk.dir=C:\Users\xxx\AppData\Local\Android\Sdk\ndk-bundle
sdk.dir=C:\Users\xxx\AppData\Local\Android\Sdk

打开app Module的build.gradle文件,在defaultConfig节点里添加以下代码
注意这里的moduleName,是我们在之前自己编写的类里面加载的so库名
ndk {
moduleName “JniTest”
ldLibs “log”, “z”, “m”
abiFilters “armeabi”, “armeabi-v7a”, “x86”
}

还要在gradle.properties里面加上这么一句话:
android.useDeprecatedNdk=true

第7步
配置so库
生成SO库
完成以上步骤之后,我们rebuild一下就可以生成so库了
在项目的app\build\intermediates\ndk\debug\lib路径下
在src\main下新建文件夹jniLIB,并将生成的SO文件拷贝到该文件夹下

第8步
因为native方法声明成了静态的方法,在Activity里面直接调用myJNI类就行

Toast.makeText(this,JNIUtil.helloWorld(),Toast.LENGTH_SHORT).show();

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值