android JNI調用(Android Studio 3.0.1)(轉)

最近回頭復習了一下android 的jni調用,卻發現按以前的方法調用失敗,一怒之下就重新摸索,碰了幾次壁,發現網上好多教程都不能成功調用,于是記錄一下現在AS版本成功好用的調用方法。

這里設定你的ndk已經下載并且設置沒問題.源碼鏈接:http://download.csdn.net/download/yeyuehei/10149844

當前android studio 版本3.0.1,步驟如下:

1.設置jni -h 和ndk -build的快捷方式

2.java代碼寫c回調的方法,及grade的配置

3.快捷鍵jni -h生成頭文件.h

4.建立c資源文件和mk文件及c函數的調用

5.快捷鍵ndk-build生成三種.so庫文件

以上是步驟,具體如下:

1.置jni -h 和ndk -build的快捷方式

新建項目,成功后點擊File,然后找到Settings...點擊找到External Tools,然后如下圖添加java -jni快捷鍵

Tool settings中三行可以直接copy上去:
$JDKPath$\bin\javah.exe
-classpath . -jni -d $ModuleFileDir$/src/main/jni $FileClass$
$ModuleFileDir$\src\main\java

?

添加ndk-build快捷鍵如下圖:

Tool settings 的兩行:

F:\software\androidstudio\sdk\ndk-bundle\ndk-build.cmd(根據自己的ndk目錄設置這個路徑)

$ModuleFileDir$\src\main(直接copy)

?

添加成功后隨便右鍵點擊一個文件找到External Tools就會發現剛才添加的快捷鍵

?

2.java代碼寫c回調的方法,及grade的配置

新建一個class 名稱隨便,這里是JniKet,如下

?

打開build.gradle 添加ndk和 sourceSets如下圖

注意:

1.ndk中的moduleName要和上圖中的libName一致

2.sourceSets中的兩行都要加上缺一不可

3.圖中紅框的代碼會在圖下面出現。。。

?

ndk {moduleName "JniDemo"abiFilters "armeabi", "armeabi-v7a", "x86"//cpu的類型
}sourceSets {main {jniLibs.srcDirs  'src/main/libsjni.srcDirs = []}
}

?

以上配置就夠了,其他都不需要

?

3.快捷鍵jni -h生成頭文件.h,建立c資源文件和mk文件及c函數的調用

選中剛才建的class(這里是JniKet),右鍵找到External Tools,選中jni -h,然后會在main下成jni文件夾,里面包含生成的頭文件,名稱格式:包名+類名.h

打開.h文件如下圖:

?

右鍵->new->c/c++ source file->type選.c(名稱隨便,這里是TestJni),然后copy上圖紅框中的兩個函數到新建的.c文件

為了驗證 能調用c方法,再建立一個c方法的頭文件和資源文件(同一個文件夾下):

test.h:

?

#include <string.h>#include <jni.h>int addValue(int x, int y);

test.c

#include "test.h"
int addValue(int x, int y){return x*10+y*10;
}

?

?

最后將test.c引入剛才建立的jni資源文件中(這里是TestJni))最后TestJni如下:

?

#include  "lifaair_edifier_com_myjni_JniKet.h"
#include "test.c"JNIEXPORT jstring JNICALL Java_lifaair_edifier_com_myjni_JniKet_testJni(JNIEnv *env, jclass jc){return (*env)->NewStringUTF(env,"fuck your father,langfei laozi's time");}
JNIEXPORT jint JNICALL Java_lifaair_edifier_com_myjni_JniKet_getValue(JNIEnv *env, jclass js ){return addValue(10, 8);}

?

?

當然別忘了mk文件兩個:

名稱:Android.mk

內容:

?

LOCAL_PATH := $(call my-dir)  
include $(CLEAR_VARS)  LOCAL_MODULE := JniDemo
LOCAL_C_INCLUDES := lifaair_edifier_com_myjni_JniKet.h
LOCAL_SRC_FILES := TestJni.cLOCAL_LDLIBS := -llog  include $(BUILD_SHARED_LIBRARY)

?

?

名稱:Application.mk

內容:

APP_ABI := armeabi armeabi-v7a x86

?

?

5.快捷鍵ndk-build生成三種.so庫文件

右鍵點擊Jniket(步驟2中生成的 java class),右鍵找到External Tools,選中ndk-build,就會生成三種.so文件如下圖:

?

當然還有最重要的調用:

?

public class MainActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);TextView tv_hello = findViewById(R.id.tv_hello);tv_hello.setText("this message from jni,its value is:\n"+JniKet.testJni()+"\n getValue():"+JniKet.getValue()); }}

編譯運行,成功運行如下圖:

?

?

轉自:https://blog.csdn.net/yeyuehei/article/details/78741753

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/390652.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/390652.shtml
英文地址,請注明出處:http://en.pswp.cn/news/390652.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

安卓源碼 代號,標簽和內部版本號

SetupSecurityPortingTuningCompatibilityReference轉到源代碼Getting Started OverviewCodelines, Branches, and ReleasesCodenames, Tags, and Build NumbersProject RolesBrand GuidelinesLicensesFAQSite UpdatesDownloading and Building RequirementsEstablishing a Bui…

git 列出標簽_Git標簽介紹:如何在Git中列出,創建,刪除和顯示標簽

git 列出標簽Tagging lets developers mark important checkpoints in the course of their projects development. For instance, software release versions can be tagged. (Ex: v1.3.2) It essentially allows you to give a commit a special name(tag).通過標記&#xff…

leetcode 278. 第一個錯誤的版本(二分)

題目 你是產品經理&#xff0c;目前正在帶領一個團隊開發新的產品。不幸的是&#xff0c;你的產品的最新版本沒有通過質量檢測。由于每個版本都是基于之前的版本開發的&#xff0c;所以錯誤的版本之后的所有版本都是錯的。 假設你有 n 個版本 [1, 2, …, n]&#xff0c;你想找…

騰訊哈勃_用Python的黑客統計資料重新審視哈勃定律

騰訊哈勃Simple OLS Regression, Pairs Bootstrap Resampling, and Hypothesis Testing to observe the effect of Hubble’s Law in Python.通過簡單的OLS回歸&#xff0c;配對Bootstrap重采樣和假設檢驗來觀察哈勃定律在Python中的效果。 In this post, we will revisit Hub…

JAVA中動態編譯的簡單使用

一、引用庫 pom文件中申明如下&#xff1a; <dependencies><!-- https://mvnrepository.com/artifact/junit/junit --><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version><…

程序員實用小程序_我從閱讀《實用程序員》中學到了什么

程序員實用小程序In short: old but gold.簡而言之&#xff1a;古老而又黃金。 Published in 1999, The Pragmatic Programmer is a book about how to become a Pragmatic Programmer. Which really means a ‘Good Programmer’. 《實用程序員》于1999年出版&#xff0c;是一…

leetcode 5786. 可移除字符的最大數目(二分法)

題目 給你兩個字符串 s 和 p &#xff0c;其中 p 是 s 的一個 子序列 。同時&#xff0c;給你一個元素 互不相同 且下標 從 0 開始 計數的整數數組 removable &#xff0c;該數組是 s 中下標的一個子集&#xff08;s 的下標也 從 0 開始 計數&#xff09;。 請你找出一個整數…

如何使用Picterra的地理空間平臺分析衛星圖像

From April-May 2020, Sentinel-Hub had organized the third edition of their custom script competition. The competition was organized in collaboration with the Copernicus EU Earth Observation programme, the European Space Agency and AI4EO consortium.從2020年…

df -l查看本地文件系統

df -l, --locallimit listing to local file systems 轉載于:https://www.cnblogs.com/jonathanyue/p/9301222.html

在Packet Tracer中路由器靜態路由配置

實驗目標&#xff1a;<1>掌握靜態路由的配置方法和技巧<2>掌握通過靜態路由方式實現網絡的連通性<3>熟悉廣域網線纜的鏈接方式技術原理&#xff1a;<1>路由器屬于網絡層設備&#xff0c;能夠根據IP包頭的信息&#xff0c;選擇一條最佳路徑&#xff0c;…

python示例_帶有示例的Python功能指南

python示例Python函數簡介 (Introduction to Functions in Python) A function allows you to define a reusable block of code that can be executed many times within your program.函數允許您定義一個可重用的代碼塊&#xff0c;該代碼塊可以在程序中多次執行。 Function…

leetcode 852. 山脈數組的峰頂索引(二分查找)

題目 符合下列屬性的數組 arr 稱為 山脈數組 &#xff1a; arr.length > 3 存在 i&#xff08;0 < i < arr.length - 1&#xff09;使得&#xff1a; arr[0] < arr[1] < … arr[i-1] < arr[i] arr[i] > arr[i1] > … > arr[arr.length - 1] 給你由…

hopper_如何利用衛星收集的遙感數據輕松對蚱hopper中的站點進行建模

hopper建筑學與數據科學 (Architectonics and Data Science) Understanding the site and topography are crucial first step of any architectural project. Site modelling can become very daunting, expensive, or just cumbersome, often having to use various software…

Git 倉庫代碼遷移步驟記錄

遷移遠程倉庫 // 克隆舊倉庫鏡像 git clone --mirror [oldRepoUrl]// 添加新倉庫地址 cd the_repo git remote add [remoteName] [newRepoUrl]// 推到新的遠程庫 git push -f --tags [remoteName] refs/heads/*:refs/heads/* 復制代碼中括號中的名稱需根據自己項目需求替換 更新…

TensorFlow MNIST 入門 代碼

其實就是按照TensorFlow中文教程的內容一步步跟著敲的代碼。 不過在運行代碼的時候遇到代碼中加載不到MNIST數據資源&#xff0c;似乎是被墻了&#xff08;(⊙﹏⊙)b&#xff09; 于是自己手動下載了數據包&#xff0c;放到 MNIST_data/ 文件夾下&#xff0c;代碼就能正常運轉了…

JavaScript中的基本表單驗證

In the past, form validation would occur on the server, after a person had already entered in all of their information and pressed the submit button. 過去&#xff0c;表單驗證會在一個人已經輸入了所有信息并按下“提交”按鈕之后在服務器上進行。 If the informa…

leetcode 877. 石子游戲(dp)

題目 亞歷克斯和李用幾堆石子在做游戲。偶數堆石子排成一行&#xff0c;每堆都有正整數顆石子 piles[i] 。 游戲以誰手中的石子最多來決出勝負。石子的總數是奇數&#xff0c;所以沒有平局。 亞歷克斯和李輪流進行&#xff0c;亞歷克斯先開始。 每回合&#xff0c;玩家從行的…

es6的Map()構造函數

普通的object對象是鍵值對的集合&#xff0c;但對于它的鍵卻有著嚴苛的要求&#xff0c;必須是字符串&#xff0c;這給我們平時帶來很多的不方便 Map函數類似于對象&#xff0c;但它是一個更加完美的簡直對集合&#xff0c;鍵可以是任意類型 set()方法可以向map實例對象中添加一…

mac里打開隱藏的 library文件夾

打開Finder&#xff0c;單擊【前往】&#xff0c;此時只有按住【option】鍵&#xff0c;就能出現“資源庫”的選項。 或者鍵入 ~/Library 進入 轉載于:https://www.cnblogs.com/laolinghunWbfullstack/p/8888124.html

華為開源構建工具_為什么我構建了用于大數據測試和質量控制的開源工具

華為開源構建工具I’ve developed an open-source data testing and a quality tool called data-flare. It aims to help data engineers and data scientists assure the data quality of large datasets using Spark. In this post I’ll share why I wrote this tool, why …