博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JNI和NDK
阅读量:4922 次
发布时间:2019-06-11

本文共 2302 字,大约阅读时间需要 7 分钟。

JNI: Java Native Interface Java调用本地代码接口

NDK : Native development Kit 安卓提供的本地开发包,用于编译成.so文件 (linux平台的库文件)

ABI :Application binary interface 应用程序二进制接口 ,.os文件以lib开始,以abi结尾,以便各自Cpu调用对应的so文件

一、JNI流程

1、新建本地方法类,以native关键字标识,例如

public class JniTest {    public native String getText();    public native Void setText(String text);}

2、使用javac生成class文件,然后使用javah生成.h文件(此处主要,由于.h文件中的函数名需要包名和方法名,所以javah的参数必须是完整的带包名的 例如 javah  com.test.jni.JniTest)

3、新建.c或者.cpp文件实现.h文件的函数

4、然后使用gcc 编译成so文件,需要linux环境。Android开发者可用NDK包中的ndk-build命令代替

二、NDK流程

1、新建本地方法类,以native关键字标识,例如

public class JniTest {    public native String getText();    public native Void setText(String text);}

2、使用javac生成class文件,然后使用javah生成.h文件(此处主要,由于.h文件中的函数名需要包名和方法名,所以javah的参数必须是完整的带包名的 例如 javah  com.test.jni.JniTest)

3、在main文件夹下即和java文件夹同级新建jni文件夹,将.h文件放入其中,在该目录下新建.c和Android.mk和Application.mk文件

.c文件如下:

#include 
#include
JNIEXPORT jstring JNICALLJava_com_lihui_test_jni_JniTest_getText(JNIEnv *env, jobject instance) { // TODO return (*env)->NewStringUTF(env, "hello jni");}JNIEXPORT jobject JNICALLJava_com_lihui_test_jni_JniTest_setText(JNIEnv *env, jobject instance, jstring text_) { const char *text = (*env)->GetStringUTFChars(env, text_, 0); // TODO (*env)->ReleaseStringUTFChars(env, text_, text);}

 Android.mk文件如下:

LOCAL_PATH := $(call my-dir)include $(CLEAR_VARS)LOCAL_MODULE := hello-jni //类库名称LOCAL_SRC_FILES := jnitest.c //编译的文件include $(BUILD_SHARED_LIBRARY) //shared可用如apk包

 Application下 

APP_ABI := all //全部类型

 4、使用ndk-build编译成so文件 主要需要配置环境变量 指定工程目录 例如  ndk-build NDK_PROJECT_PATH=D:\Android\WorkSpace\JNI\app\src\main 保证jni文件夹在此目录下,然后就会生成libs,obj等文件夹,包含了so文件

   5、在main下新建jniLibs文件夹,将libs下的so文件拷入

 6、然后修改本地方法类 调用本地方法类 如下

public class JniTest {    static {        System.loadLibrary("hello-jni");    }    public native String getText();    public native Void setText(String text);}public class MainActivity extends AppCompatActivity {    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        TextView tv = (TextView) findViewById(R.id.tv);        JniTest jniTest = new JniTest();        tv.setText(jniTest.getText());    }}

  

 

转载于:https://www.cnblogs.com/lihuiupupup/p/9247965.html

你可能感兴趣的文章
宽容的心态,开明的头脑
查看>>
centos7安装docker和docker compose【转】
查看>>
由一个简单的有返回值的子程序想到的
查看>>
php:获取一个表不含text类型的全部字段
查看>>
java-泛形使用
查看>>
多线程下C#如何保证线程安全?
查看>>
前端限流大法
查看>>
html 中head显示 在标题栏里面的图片
查看>>
关于float的低精度问题
查看>>
JavaScript学习笔记之Object
查看>>
poj1149 PIGS
查看>>
深浅拷贝与赋值
查看>>
SharePoint Online 创建网站集
查看>>
一阶段
查看>>
Programmer, Rank Thyself
查看>>
初识python+linux最基本的操作
查看>>
hdu 4207
查看>>
杨澜给二十几岁的女孩的告诫
查看>>
【BZOJ】2002: [Hnoi2010]Bounce 弹飞绵羊
查看>>
1082 射击比赛
查看>>