当前位置: 首页 > 编程笔记 >

基于Android studio3.6的JNI教程之helloworld思路详解

荆修明
2023-03-14
本文向大家介绍基于Android studio3.6的JNI教程之helloworld思路详解,包括了基于Android studio3.6的JNI教程之helloworld思路详解的使用技巧和注意事项,需要的朋友参考一下

jdk环境变量配置:

path中增加下面2个路径,也就是android studio的路径,android有自带的jdk。

E:\Android\Android Studio\jre\bin
E:\Android\Android Studio\bin

新建工程:

一定要选择Native c++类型,最后要选c++11支持。

SDK设置:

File->Settings

File->Project Structure

首先确定工程的目录结构,然后尝试运行一下工程,使用模拟器,确保工程没问题,

在MainActivity的同级目录,新建一个hello.java,然后做一个简单的实现,

package com.example.myapplication;
 
public class hello {
 public native int add(int i, int j);
}

使用android studio自带的Terminal进入该hello.java所在目录,执行,

javac hello.java

Terminal下回到app/src/main所在目录,执行,

javah -d jni -classpath ./java com.example.myapplication.hello

此时,会在main目录下面生成一个和cpp,java同级的目录jni。

在该目录结构里面新建hello.cpp。

将com_example_myapplication_hello.h中的内容复制进hello.cpp中,并且进行方法的实现,

#include <jni.h>
/* Header for class com_example_myapplication_hello */
 
#ifndef _Included_com_example_myapplication_hello
#define _Included_com_example_myapplication_hello
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class: com_example_myapplication_hello
 * Method: add
 * Signature: (II)I
 */
 
#include "com_example_myapplication_hello.h"
 
JNIEXPORT jint JNICALL Java_com_example_myapplication_hello_add
 (JNIEnv *, jobject, jint i, jint j){return i+j;}
 
#ifdef __cplusplus
}
#endif
#endif

将com_example_myapplication_hello.h,hello.cpp这连个文件复制到cpp所在的目录,

然后修改CMakeLists.txt,增加,

add_library( # Sets the name of the library.
 hello
 
 # Sets the library as a shared library.
 SHARED
 
 # Provides a relative path to your source file(s).
 hello.cpp )

修改target_link_libraries如下,

target_link_libraries( # Specifies the target library.
  native-lib
  hello
  # Links the target library to the log library
  # included in the NDK.
  ${log-lib} )

修改hello.java的调用方式,

package com.example.myapplication;
 
public class hello {
 
 static {
 System.loadLibrary("hello");
 }
 public native int add(int i, int j);
}

html" target="_blank">修改MainActivity.java中的onCreate函数,

protected void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 setContentView(R.layout.activity_main);
 
 // Example of a call to a native method
 TextView tv = findViewById(R.id.sample_text);
 //tv.setText(stringFromJNI());
 tv.setText("hello 9+10= " + new hello().add(9, 10));
 }

然后,rebuild project,没有错误后,然后run app。

最终程序整体目录结构,以及运行效果,

 JNI的整体流程思路:

Java先定义一个类,类中定义一个需要c++来实现的方法.通过javah生成需要c++实现的.h的c++头文件实现.h的c++头文件中定义的方法Cmake编译运行

总结

到此这篇关于基于Android studio3.6的JNI教程之helloworld思路详解的文章就介绍到这了,更多相关android studio JNI helloworld内容请搜索小牛知识库以前的文章或继续浏览下面的相关文章希望大家以后多多支持小牛知识库!

 类似资料:
  • 本文向大家介绍零基础易语言入门教程(二)之编程思路,包括了零基础易语言入门教程(二)之编程思路的使用技巧和注意事项,需要的朋友参考一下 易语言简介: 易语言是一门以中文作为程序代码编程语言。以“易”著称。创始人为吴涛。早期版本的名字为E语言。易语言最早的版本的发布可追溯至2000年9月11日。创造易语言的初衷是进行用中文来编写程序的实践。从2000年至今,易语言已经发展到一定的规模,功能上、用户数

  • 本文向大家介绍python基础教程之序列详解,包括了python基础教程之序列详解的使用技巧和注意事项,需要的朋友参考一下 sequence 序列 sequence(序列)是一组有顺序的元素的集合 (严格的说,是对象的集合,但鉴于我们还没有引入“对象”概念,暂时说元素) 序列可以包含一个或多个元素,也可以没有任何元素。 我们之前所说的基本数据类型,都可以作为序列的元素。元素还可以是另一个序列,以及

  • 1.智能合约文件的编写 #include <eosiolib/eosio.hpp> #include <eosiolib/print.hpp> //用eosio命名空间 using namespace eosio; //所有的智能合约都继承自contract类 class hello : public eosio::contract { public: using contr

  • 本文向大家介绍Python 基础教程之str和repr的详解,包括了Python 基础教程之str和repr的详解的使用技巧和注意事项,需要的朋友参考一下 Python str和repr的详解 str可以将值转化为合理的字符串形式,以便用户可以理解; repr会以合法Python表达式的形式来表达值。 举例如下: 注意到,str表示一种类型,即字符串;repr则是一个函数。  如有疑问请留言或者到

  • 基本思路 【提示】请先看练习2中提到的论文, 理解后在看下面的内容。 考察 round-robin 调度器,在假设所有进程都充分使用了其拥有的 CPU 时间资源的情况下,所有进程得到的 CPU 时间应该是相等的。但是有时候我们希望调度器能够更智能地为每个进程分配合理的 CPU 资源。假设我们为不同的进程分配不同的优先级,则我们有可能希望每个进程得到的时间资源与他们的优先级成正比关系。Stride调

  • 本文向大家介绍Java基础教程之理解Annotation详细介绍,包括了Java基础教程之理解Annotation详细介绍的使用技巧和注意事项,需要的朋友参考一下 Java基础之理解Annotation 一、概念    Annontation是Java5开始引入的新特征。中文名称一般叫注解。它提供了一种安全的类似注释的机制,用来将任何的信息或元数据(metadata)与程序元素(类、方法、成员变量