一個完整的NDK編譯過程
1、建立android工程
2、編寫JAVA類,其中包含nativie方法
例如:
public class JNI {
public native void write();
public native void myOpen(String pathname);
}
3、生成JNI標頭檔案
使用javah命令
使用cmd進入android專案的bin目錄中,然後執行 javah -classpath . -jni com.android.myjni.JNI這個命令
用法:javah [選項] <類>
其中 [選項] 包括:
-help 輸出此幫助訊息並退出
-classpath <路徑> 用於裝入類的路徑
-bootclasspath <路徑> 用於裝入引導類的路徑
-d <目錄> 輸出目錄
-o <檔案> 輸出檔案(只能使用 -d 或 -o 中的一個)
-jni 生成 JNI樣式的標頭檔案(預設)
-version 輸出版本資訊
-verbose 啟用詳細輸出
-force 始終寫入輸出檔案
com.android.myjni.JNI指包com.android.myjni下的JNI類,是要生成該類的JNI標頭檔案
例如:com_android_myjni_JNI.h
-* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
-* Header for class com_android_myjni_JNI */
#ifndef _Included_com_android_myjni_JNI
#define _Included_com_android_myjni_JNI
#ifdef __cplusplus
extern "C" {
#endif
-*
* Class: com_android_myjni_JNI
* Method: write
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_com_android_myjni_JNI_write
(JNIEnv *, jobject);
-*
* Class: com_android_myjni_JNI
* Method: myOpen
* Signature: (Ljava/lang/String;)I
*/
JNIEXPORT void JNICALL Java_com_android_myjni_JNI_myOpen
(JNIEnv *, jobject, jstring);
#ifdef __cplusplus
}
#endif
#endif
4、編寫c程式碼
例如:com_android_myjni_JNI.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/types.h>
#include "com_android_myjni_JNI.h"
JNIEXPORT void JNICALL Java_com_android_myjni_JNI_write
(JNIEnv *e, jobject j)
{
FILE* f = fopen("/sdcard/11.txt","w+");
fprintf(f, "aaaaaaaaaaaaa");
fclose(f);
}
JNIEXPORT void JNICALL Java_com_android_myjni_JNI_myOpen
(JNIEnv *e, jobject j, jstring pathname)
{
//從jstring型別取得c語言環境下的char*型別
const char* name = (*e)->GetStringUTFChars(e, pathname, 0);
int fd;
ssize_t size;
char s[] = "Linux open!/n";
char buffer[80];
fd = open(name, O_RDWR|O_CREAT|O_APPEND);
if(-1 == fd)
{
printf("open %s error!/n", name);
}
else
{
printf("open %s success!/n", name);
size = write(fd, s, sizeof(s));
printf("wirte %d bytes!/n", size);
memset(buffer, '/0', sizeof(buffer));
size = read(fd, buffer, sizeof(buffer));
printf("read %d bytes!/n", size);
close(fd);
printf("%s/n", buffer);
}
//釋放jni分配的記憶體
(*e)->ReleaseStringUTFChars(e, pathname, name);
}
5、編寫Android.mk
例如:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := myjni
LOCAL_SRC_FILES := com_android_myjni_JNI.c
include $(BUILD_SHARED_LIBRARY)
6、編譯so檔案
進行編譯so檔案:
進入工程目錄,執行 ndk-build,例如:~/workspace/MYJni$ ndk-build
則會在libs/armeabi/生成相應的so檔案,例如:libmyjni.so
工程目錄結構:
src下包含java檔案
自己新建一個jni檔案,包含com_android_myjni_JNI.h、com_android_myjni_JNI.c、Android.mk檔案
so檔案會自動在libs/armeabi/下生成
測試程式碼:
package com.android.myjni;
import android.app.Activity;
import android.os.Bundle;
public class JniTest extends Activity {
static {
System.loadLibrary("myjni");
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
JNI j = new JNI();
j.write();
j.myOpen("/sdcard/12.txt");
}
}
相關推薦
一個完整的NDK編譯過程
1、建立android工程 2、編寫JAVA類,其中包含nativie方法 例如: public class JNI { public native void write(); public native void myOpen(String path
Plumble-android 一次完整的編譯過程(Opus語音壓縮專案)
前言:Opus可以實現1kyte/s的壓縮語音傳輸,過癮! Plumble-android 一次完整的編譯過程 NDK 標籤:Plumble android mumble Jumble opus speex celt talkiewalkie 作者:BI7JTA 時間:2
史上最全的基於ffmpeg+sdl網路攝像頭編解碼播放資料(包含交叉編譯過程,附帶完整原始碼)
原創博文,嚴禁私自轉載,轉載請註明出處!!! 近期,由於工作需要,要在開發板上跑一個攝像頭,攝像頭款式比較老,不支援rtsp格式,所以選擇編譯ffmpeg+sdl實現軟解碼播放攝像頭,特此記錄整個編譯過程(非常之艱辛,發文留念) 在ubuntu上交叉編譯環境的搭建:因為開發板上搭建的程式的執
容器完整處理一個http請求的過程
初學java web的朋友們應該都知道tomcat容器,但是tomcat是如何完成一次http請求的過程,這裡做一個記錄。 當用戶在客戶端點選一個連結,該連結的URL指向一個servlet,經過網路轉發到應用所在的web伺服器的,此時web伺服器不是直接把申請發給servlet本身,而是傳送給部署該s
一個cpp檔案的編譯過程詳解
一個CPP檔案的編譯過程 籠統的說一個CPP檔案的編譯過程就是以下幾步 Created with Raphaël 2.1.2預處理(做優化,生成.i檔案)編譯器(生成.s檔案)彙編器(生成.o檔案) 連結器(連線庫檔案和其他目的碼) 生成可執行檔案
一個完整的網路訪問過程的分析(巨集觀角度分析)
我們以訪問百度為例,來一步步分析一個完整的網路訪問過程是怎樣的 當我們輸入http://www.baidu.com,然後按回車,發生的一系列事情如下: 在這裡我們通過使用ie的F12開發人員工具進行分析: 1、首先,會進行一次DNS域名解析(就是找到對應的IP地址),DNS
一個C語言程式的編譯過程
這是一個再簡單不過的C語言程式: #include <stdio.h> int main() { printf("hello world!\n"); return 0; } 執行gcc test.c,就使一個原始檔變成了可
一個完整的URL 解析過程
網頁解析的全過程 1、使用者輸入網址,瀏覽器發起DNS查詢請求 使用者訪問網頁,DNS伺服器(域名解析系統)會根據使用者提供的域名查詢對應的IP地址 域名解析伺服器是基於UDP實協議實現的一個應用程式,通常通過監聽53埠來獲取客戶端的域名解析請求。DNS查詢過過程如下: 瀏覽器快
一個完整的HTTP請求過程詳細
一個完整的HTTP請求過程 整個流程 域名解析 —> 與伺服器建立連線 —> 發起HTTP請求 —> 伺服器響應HTTP請求,瀏覽器得到html程式碼 —> 瀏覽器解析html程式碼,並請求html程式碼中的資源(如js、css、
一個完整的命令列上傳程式碼到git的過程
//進入到工程資料夾下 1.$ cd 到工程資料夾下 //初始化 2.$ git init //將所有資料夾新增到倉庫 3.$ git add . 4.$ git commit -m"新增程式
Access應用筆記<四>-一個完整的自動化報表搭建過程
距離之前的三篇日誌已經很久啦,今天終於完成了一個比較完整的自動化報表搭建過程 基於公司資料保密原則,樣板就不放到網上來了,簡單說一下背景: 這次access實現的功能包括: 1)為部門整體搭建了一個員工基本資料資料庫,裡面包括從各個系統裡獲得的員工資訊,如Zhang San,一個系統裡叫San Zhan
spark1.3編譯過程中遇到的一個坑
在編譯spark1.3.0時: export MAVEN_OPTS="-Xmx2g -XX:MaxPermSize=512M -XX:ReservedCodeCacheSize=512m" mvn clean package -DskipTests -Phadoop-2.4 -Dhadoop.ve
一個完整的網路訪問過程的分析(從計算機網路的角度)
首先,我們要明確上網需要的四個引數(本機),分別是: 1、本機的ip地址 2、子網掩碼 3、閘道器的ip地址 4、DNS的ip地址 這裡,我以自己的電腦為例(我的電腦用的是配置ip,當然大多數用的都是動態獲取也就是dhcp),截圖如下: 引數解釋: a、閘道器本質上是一個
記一次spring5原始碼完整編譯過程
學習java已有3年之久,spring一直停留在應用階段,兩次面試阿里的經歷讓我深感學習spring原始碼的重要性,廢話不多說,開搞! 1、環境: jdk1.8+spring5+gradle4.7+eclipse4.6 如果要參考該教程,環境最好一樣(eclipse除外
aws 一個完整的網際網路專案實踐過程
簡介 一個完整的網際網路專案,包括前端和後端, 前端: 1. 大多使用AWS的LB服務,tcp http https協議都是支援的 2. public subnet。 由於需要被interne
docer啟動一個容器時的過程
dockerdocker在執行run 命令來啟動一個容器時,內部是如何操作的那?下面我們來驗證下:1、當我們執行完docker run -d -p 80:80 httpd 這條命令後,會先在本地查找是否有httpd這個鏡像2、如果本地查找不到,就會從遠程庫中下載3、下載完後,啟動起來,生成一個digest的i
ffmpeg的ubuntu的編譯過程(編譯靜態庫和動態庫)
ffmpeg第一步源碼下載通過git下載git clone https://git.ffmpeg.org/ffmpeg.git ffmpeg或者直接下載wget http://ffmpeg.org/releases/ffmpeg-3.3.tar.bz2如果是下載的ffmpeg-3.3.tar.bz2 需要進
SQL編譯過程
編譯過程 安全問題 占位符 安全 rep logs 編譯 我們 .cn 拼串 (Statement)方式: 1、編譯次數多,效率比較低;會出現SQL註入問題(數據安全問題):先傳參數再編譯 2、Sql文對應的字符串不一樣,需要再次編譯。 Sql文對應的字符串一樣,不
手動搭建一個完整的angular實踐項目
jquery引用 結合 image door 實踐 oot 加載 lib 也會 以下我記錄如何簡單的搭建一個angular項目, 比較適合有前端基礎,但又沒有使用過angular的前端開發人員,因為我看到網上的教程又都配套的使用了一些其他框架或者打包工具,以及進
NDK編譯庫執行時報dlopen failed: cannot locate symbol "__exidx_end" 解決的方法
and col 執行 data- pop cannot mod flags fuse 當用NDK編譯的庫在執行載入時報例如以下錯: dlopen("/data/data/xxx.xxx.xxx/lib/libxxx.so") failed: dlopen failed