就是生产个so文件,并且可以调用C里面的方法。但为什么要写一篇满论坛多的是的文章呢,就是因为我踩了N多个坑,希望可以帮助大家,让大家少走弯路。
先看一下效果图
【1环境的搭建】
NDK没有的可以去下载 :https://developer.android.com/ndk/downloads/index.html
添加完NDK 记得看一下这里
接着看这里
要加上这句代码:android.useDeprecatedNdk=true 很重要!很重要!
【2 java类编写的代码】
public class JniTest {
static {
System.loadLibrary("jary");
}
public native String getString();
}
然后接着
之后你会发现生成了一个JniTest .class文件
【3 Terminal 命令】
cd 到mian 文件下 然后 输入命令:javah -d jni -classpath 自己编译后的 class 文件的绝对路径
debug 后面是空格!debug 后面是空格!debug 后面是空格!
之后就会生成一个.h的文件
创建一个.c的文件,include后面的是生成.h文件的名字
里面的(JNIEXPORT jstring JNICALL Java_com_example_lxndk_JniTest_getString)
是.h文件中方法(重写一下)
#include"com_example_lxndk_JniTest.h"
JNIEXPORT jstring JNICALL Java_com_example_lxndk_JniTest_getString
(JNIEnv *env, jobject jobject1){
return (*env)->NewStringUTF(env,"Hello Jin =_=!");
}
然后–在 build.gradle defaultConfig 中添加如下代码
ndk {
moduleName "jary" //生成的so名字
abiFilters "armeabi", "armeabi-v7a", "x86" //输出指定三种abi体系结构下的so库。
}
到这里的jni 调 C 就完成了,但是我想说的是!为什么会报这个错???
然后我发现我貌似缺少了东西,Android.mk…
创建Android.mk文件
# 构建系统提供的宏函数 my-dir 将返回当前目录(包含 Android.mk 文件本身的目录)的路径,基本上是固定的,不需要去动
LOCAL_PATH := $(call my-dir)
# 会清除很多 LOCAL_XXX 变量,不会清除 LOCAL_PATH,基本上是固定的,不需要去动
include $(CLEAR_VARS)
# 需要构建模块的名称,会自动生成相应的 libNDKSample.so 文件,每个模块名称必须唯一,且不含任何空格
LOCAL_MODULE := jary
# 包含要构建到模块中的 C 或 C++ 源文件列表
LOCAL_SRC_FILES := jary.c
# 指定这个模块里会用到哪些原生 API,详见:https://developer.android.google.cn/ndk/guides/stable_apis.html
LOCAL_LDLIBS := -llog
# 帮助系统将所有内容连接到一起,固定的,不需要去动
include $(BUILD_SHARED_LIBRARY)
要改成自己对应的.c 还有构建模块的名称
Application.mk
# 选择不同的 ABI,多个使用空格作为分隔符,全部是all
# APP_ABI := armeabi armeabi-v7a
APP_ABI := all
# 指定要使用的运行时
APP_STL := gnustl_static
最后在 build.gradle android 下 指定目录!
运行效果
【4生成so文件】
到这里才基本结束!
源码地址:https://download.csdn.net/download/macaopark/10340231
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/2854.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...