本文共 2246 字,大约阅读时间需要 7 分钟。
Hello,大家好,我是码农星期八,事情是这样婶的,最近在测试安卓Java层通过NDK调用so©层,中间发生了一些莫名其妙的一些问题,以此来记录一下。
本项目通过AndroidStudio创建。
创建项目过程不做过多介绍,不是本文重点。
保证能通过编译,并且能运行起来就好。
就简简单单一个项目就行。
代码
//获取C层返回的字符串public native CharSequence GetSoBackString();
如图
这会提示错误,但是不用管,编译的时候不会报错。
1.定义: JAVA Native Interface JNI是一种协议2.作用: 通过JNI能使java和c++相互调用
抄的,没啥用,反正就是通过JNI来实现Java和C交流的。
<项目>\app\src\main\java
下这个箭头好像反了,但是不重要,反正就是cd到这个项目的java目录下。
命令
javah -jni -encoding UTF-8 com.example.ti.testndk.MainActivity
如图
跟我一样表示正确。
javah
最后后面的参数就是包名和类名。
这里移动写错了,改成复制。
JNIstudy.c
#includeJNIEXPORT jobject JNICALL Java_com_example_ti_testndk_MainActivity_GetSoBackString (JNIEnv *env, jobject obj){ //类型转换 NewStringUTF(env,字符串) jstring str = (*env)->NewStringUTF(env, "hello test NDK"); return str; }
JNIstudy.h
/* DO NOT EDIT THIS FILE - it is machine generated */#include/* Header for class com_example_ti_testndk_MainActivity */#ifndef _Included_com_example_ti_testndk_MainActivity#define _Included_com_example_ti_testndk_MainActivity#ifdef __cplusplusextern "C" {#endif/* * Class: com_example_ti_testndk_MainActivity * Method: GetSoBackString * Signature: ()Ljava/lang/CharSequence; */JNIEXPORT jobject JNICALL Java_com_example_ti_testndk_MainActivity_GetSoBackString (JNIEnv *, jobject);#ifdef __cplusplus}#endif#endif
如图
Android.mk
LOCAL_PATH := $(call my-dir)include $(CLEAR_VARS)LOCAL_MODULE := JNIstudy #模块名LOCAL_SRC_FILES := JNIstudy.c #源文件.c或.cppLOCAL_ARM_MODE := arm #编译后的指令集ARM指令LOCAL_LDLIBS := -llog #依赖库include $(BUILD_SHARED_LIBRARY) #指定编译文件的类型
Application.mk
APP_ABI := armeabi-v7a
如图
先cd到jni文件夹下。
编译成功过后,编译好的东西会在libs下。
在app下的build.gradle的android下添加以下代码。
sourceSets { main { jniLibs.srcDirs = ['libs'] } }
代码
static { System.loadLibrary("JNIstudy"); }
如图
到此,基本上应该是可以的了,运行即可。
这不,Toast
拿到的是C层返回的字符串。
本文重点并不是说让你学会多nb的东西,而是NDK静态注册入门。
毕竟很多时候被劝退并不是代码太难,而是莫名其妙的问题。
越努力,越幸运。
如果在操作过程中有任何问题,记得下面留言,我们看到会第一时间解决问题。
我是码农星期八,如果觉得还不错,记得动手点赞一下哈。
感谢你的观看。
转载地址:http://uqvmi.baihongyu.com/