導航:首頁 > 程序命令 > androidjavah命令

androidjavah命令

發布時間:2022-10-29 00:58:56

1. androidStudio如何配置NDK/JNIAndroidStudio怎麼調用so動態鏈接庫

AndroidStudio怎麼調用so動態鏈接庫?在我們日常開發中,經常會用到一些復雜的加密演算法以保證通信的安全。通常這些演算法會用C或C++實現後打包成.so動態鏈接庫並向java層開發介面方便調用。


以AndroidStudio為例

1 . 首先去下載NDK包,下載路徑如下可根據自己系統定點下載

https://developer.android.google.cn/ndk/downloads/index.html

static{
System.loadLibrary("jnitext");
}
publicnativeStringget_1111CLang_1String();

2. AndroidStudio怎樣使用NDK開發示例

1、新建一個Android工程,這一步就不多說了;

2、在AndroidStudio中配置NDK路徑,方法是:

(1)先下載NDK並安裝(這句基本是廢話);

(2)點菜單欄的File->ProjectStructure…->在打開的窗口中左側選中SDKLocation->在右側Android NDK Location中填入NDK目錄所在路徑

3、編譯生成.class文件,方法是:

點菜單欄的Build->Make Project

這時,在工程的app/build/intermediates下就會生成classes文件夾,打開classes目錄下的debug目錄就會看到以你的包名命名的各級文件夾,最里邊文件夾下有你的Java類對應的.class文件;

4、確定你要引用本地方法的類:

其實你也可以先生成jni目錄,再去創建這個類,但是先Google顯然建議先創建要引用C代碼的Java類,因為AndroidStudio可以根據你在java類中定義的native方法的名稱來自動生成.h頭文件。

比如你想在MainActivity中引用本地方法,那麼你先用

static {

System.loadLibrary("myNativeLib");

}

來聲明本地代碼庫,然後定義幾個natvie方法,比如

public native String getStringFromNative();

5、使用javah命令行生成jni目錄及對應的頭文件:

我用的是AndroidStudio 2.1.1,在主界面最下邊就能找到Terminal,點一下就能打開系統的命令行工具,並且已經為你自動cd到當前工程所在目錄

6、配置build.gradle文件

這里的build.gradle是指app模塊下的build.gradle,不是整個工程的build.gradle文件。在模塊的build.gradle的defaultConfig下加入以下idk配置:

ndk {

moleName"myNativeLib"

ldLibs "log", "z", "m"

abiFilters "armeabi", "armeabi-v7a", "x86"

}

7、配置local.properties文件

打開工程目錄下的local.properties,感覺這一步是自動配置的,或者說在你一開始在AndroidStudio中指定NDK目錄時已經自動生成了。我的AndroidStudio在打開local.properties已經有了

ndk.dir=/Develop/Android/android-ndk-r10e

這一行,所以就不用配了;

8、配置gradle.properties

打開工程目錄下的gradle.properties文件(注意不是build.gradle,而是gradle.properties),在文件的最後一行加入

android.useDeprecatedNdk=true

這句的作用是允許我們使用已經過時的NDK版本,不知道AndroidStudio要求使用哪個版本的NDK才不會報錯,總之只要配置了這一句就可以使用比較舊的NDK版本了,我用的r10;

至此我們在AndroidStudio中就完成了NDK環境的配置,接下來就可以寫Native代碼了;

9、寫一個.c文件測試一下是否運行正常

(1)在我們之前生成src/main/jni目錄下新建一個.c文件,方法是在jni文件夾上點滑鼠右鍵,選擇New->C/C++ Source File,然後在彈出的對話框中填入.c或.cpp文件的文件名就可以了,比如說mail.c

3. Android Studio怎麼用JNI編寫出Hello World

第一步:

在自己項目中創建一個包含native的方法類HelloWorld.java -->包名com.ningso.ningsodemo

public class HelloWorld {
public native String sayHello(String name); // 1.聲明這是一個native函數,由本地代碼實現
static {
System.loadLibrary("hello"); // 2.載入實現了native函數的動態庫,只需要寫動態庫的名字
}
}

第二步:

在終端執行javac命令將.java源文件編譯成.class位元組碼文件

完結


4. 為什麼在android studio里javah命令不存在,但是在cmd里沒錯

進入Java目錄執行如下命令
javah -d ../jni packageName.className
例如:
javah -d ../jni com.dremap.okhttpdemo.NdkJniUtils

5. android jni abifilters為什麼沒產生文件

android studio 中簡單的jni開發
Let』s Go!!!
准備工作不再需要什麼cgwin來編譯ndk(太特么操蛋了),現在只需要你下載一下NDK的庫就ok了,然後你也可以去離線下載http://www.androiddevtools.cn最新版,這里吐槽一下android studio對NDK的支持還有待提高。
效果
看下今天的效果:(安卓jni獲取 apk的包名及簽名信息)

必須的步驟
1.配置你的ndk路徑(local.properties)
ndk.dir=E:\Android\sdk\android-ndk-r11b-windows-x86_64\android-ndk-r11b
2.grale配置使用ndk(gradle.properties)
android.useDeprecatedNdk=true
3.在mole下的build.gradle添加ndk以及jni生成目錄
ndk{
moleName 「JNI_ANDROID」
abiFilters 「armeabi」, 「armeabi-v7a」, 「x86」 //輸出指定三種abi體系結構下的so庫,目前可有可無。
}
sourceSets.main{
jniLibs.srcDirs = [『libs』]
}
准備工作做好了開始寫代碼:(jni實現獲取應用的包名和簽名信息)
步驟1:先寫要實現本地方法的類,及載入庫(JNI_ANDROID也就是ndk 裡面配的moleName)
?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32

<code class="hljs java">package com.losileeya.getapkinfo;

/**
* User: Losileeya ([email protected])
* Date: 2016-07-16
* Time: 11:09
* 類描述:
*
* @version :
*/
public class JNIUtils {
/**
* 獲取應用的簽名
* @param o
* @return
*/
public static native String getSignature(Object o);

/**
* 獲取應用的包名
* @param o
* @return
*/
public static native String getPackname(Object o);

/**
* 載入so庫或jni庫
*/
static {
System.loadLibrary("JNI_ANDROID");
}
}</code>

注意我們 的載入c方法都加了native關鍵字,然後要使用jni下的c/c++文件就必須使用System.loadLibrary()。
步驟2:使用javah命令生成.h(頭文件)
javah -jni com.losileeya.getapkinfo.JNIUtils
執行完之後你可以在mole下文件夾app\build\intermediates\classes\debug下看見生成的 .h頭文件為:
com_losileeya_getapkinfo_JNIUtils.h
?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

<code class="hljs vala">/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_losileeya_getapkinfo_JNIUtils */

#ifndef _Included_com_losileeya_getapkinfo_JNIUtils
#define _Included_com_losileeya_getapkinfo_JNIUtils
#ifdef __cplusplus
extern "C" {
#endif
JNIEXPORT jstring JNICALL Java_com_losileeya_getapkinfo_JNIUtils_getPackname(JNIEnv *, jobject, jobject);
JNIEXPORT jstring JNICALL Java_com_losileeya_getapkinfo_JNIUtils_getSignature(JNIEnv *, jobject, jobject);
#ifdef __cplusplus
}
#endif
#endif</jni.h></code>

在工程的main目錄下新建一個名字為jni的目錄,然後將剛才的.h文件剪切過來,當然文件名字是可以修改的
步驟3:根據.h文件生成相應的c/cpp文件
?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41

<code class="hljs scala">//
// Created by Administrator on 2016/7/16.
//
#include <stdio.h>
#include <jni.h>
#include <stdlib.h>
#include "appinfo.h"
JNIEXPORT jstring JNICALL Java_com_losileeya_getapkinfo_JNIUtils_getPackname(JNIEnv *env, jobject clazz, jobject obj)
{
jclass native_class = env->GetObjectClass(obj);
jmethodID mId = env->GetMethodID(native_class, "getPackageName", "()Ljava/lang/String;");
jstring packName = static_cast<jstring>(env->CallObjectMethod(obj, mId));
return packName;
}

JNIEXPORT jstring JNICALL Java_com_losileeya_getapkinfo_JNIUtils_getSignature(JNIEnv *env, jobject clazz, jobject obj)
{
jclass native_class = env->GetObjectClass(obj);
jmethodID pm_id = env->GetMethodID(native_class, "getPackageManager", "()Landroid/content/pm/PackageManager;");
jobject pm_obj = env->CallObjectMethod(obj, pm_id);
jclass pm_clazz = env->GetObjectClass(pm_obj);
// 得到 getPackageInfo 方法的 ID
jmethodID package_info_id = env->GetMethodID(pm_clazz, "getPackageInfo","(Ljava/lang/String;I)Landroid/content/pm/PackageInfo;");
jstring pkg_str = Java_com_losileeya_getapkinfo_JNIUtils_getPackname(env, clazz, obj);
// 獲得應用包的信息
jobject pi_obj = env->CallObjectMethod(pm_obj, package_info_id, pkg_str, 64);
// 獲得 PackageInfo 類
jclass pi_clazz = env->GetObjectClass(pi_obj);
// 獲得簽名數組屬性的 ID
jfieldID signatures_fieldId = env->GetFieldID(pi_clazz, "signatures", "[Landroid/content/pm/Signature;");
jobject signatures_obj = env->GetObjectField(pi_obj, signatures_fieldId);
jobjectArray signaturesArray = (jobjectArray)signatures_obj;
jsize size = env->GetArrayLength(signaturesArray);
jobject signature_obj = env->GetObjectArrayElement(signaturesArray, 0);
jclass signature_clazz = env->GetObjectClass(signature_obj);
jmethodID string_id = env->GetMethodID(signature_clazz, "toCharsString", "()Ljava/lang/String;");
jstring str = static_cast<jstring>(env->CallObjectMethod(signature_obj, string_id));
char *c_msg = (char*)env->GetStringUTFChars(str,0);

return str;
}</jstring></jstring></stdlib.h></jni.h></stdio.h></code>

注意:要使用前得先聲明,方法名直接從h文件考過來就好了,studio目前還是很操蛋的,對於jni的支持還是不很好。
步驟4:給項目添加Android.mk和Application.mk
此步驟顯然也是不必要的,如果你需要生成so庫添加一下也好,為什麼不呢考過去改一下就好了,如果你不寫這2文件也是沒有問題的,因為debug下也是有這些so庫的。
好吧,勉強看一下這2貨:
Android.mk
?

1
2
3
4
5

<code class="hljs ruby">LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := JNI_ANDROID
LOCAL_SRC_FILES =: appinfo.cpp
include $(BUILD_SHARED_LIBRARY)</code>

Application.mk
?

1
2

<code class="hljs makefile">APP_MODULES := JNI_ANDROID
APP_ABI := all</code>

android studio下External Tools的高級配置NDK一鍵javah,ndk生成so庫
eclipse開發ndk的時候你可能就配置過javah,所以android studio也可以配置,是不是很興奮:
Settings—>Tools—->External Tools就可以配置我們的終端命令了,別急一個一個來:
javah -jni 命令的配置(一鍵生成h文件)

我們先來看參數的配置:
1.Program:JDKPath\bin\javah.exe 這里配置的是javah.exe的路徑(基本一致)
2.Parametes: -classpath . -jni -d MoleFileDir/src/main/jni FileClass這里指的是定位在Mole的jni文件你指定的文件執行jni指令<喎�"/kf/ware/vc/" target="_blank" class="keylink">++IpDQo8cD48aW1nIGFsdD0="" src="/uploadfile/Collfiles/20160718/201607181017581505.png" title="\" />
我們同樣來看參數的配置:
1.Program:E:\Android\sdk\android-ndk-r11b-windows-x86_64\android-ndk-r11b\ndk-build.cmd 這里配置的是ndk下的ndk-build.cmd的路徑(自己去找下)
2.Working:MoleFileDir\src\main\
javap-s(此命令用於c掉java方法時方法的簽名)

我們同樣來看參數的配置:
1.Program:JDKPath\bin\javap.exe 這里配置的是javap.exe的路徑(基本一致)
2.Parametes: -classpathMoleFileDir/build/intermediates/classes/debug -s FileClass 這里指的是定位到build的debug目錄下執行 javap -s class文件
3.Working:MoleFileDir
這里介紹最常用的3個命令,對你的幫助應該還是很大的來看一下怎麼使用:
javah -jni的使用:選中native文件—>右鍵—>External Tools—>javah -jni
效果如下:

是不是自動生成了包名.類名的.h文件。
ndk-build的使用:選中jni文件—>右鍵—>External Tools—>ndk-build
效果如下:

是不是一鍵生成了7種so庫,你還想去debug目錄下面去找嗎
javap-s的使用:選中native文件—>右鍵—>External Tools—>javap-s
效果如下:

看見了每個方法下的descriptor屬性的值就是你所要的方法簽名。
3種一鍵生成的命令講完了,以後你用到了什麼命令都可以這樣設置,是不是很給力。

6. android studio 2.0 include lt;jni.h>找不到 有知道的小夥伴嗎

總共有三種方式生成Jni頭文件,但歸根結底只有一種,只是操作方法不一樣,我在這里做一下記錄,方便下次使用。1.11.利用AndroidStudio的Terminal,進入你自己的Android工程文件的app/src/main目錄,例如(D:\Users\AndroidStudio\Application\app\src\main)在Terminal中輸入命令cdapp\src\main這樣就進入到了main目錄,可以使用dir命令查看當前目錄有哪些文件總共有三種方式生成Jni頭文件2.在Terminal中輸入命令javah-djni-jni-classpath..\..\build\intermediates\classes\debugcom.example.lenovo.application.JniClass解釋:-d輸出目錄,後面跟上要生成的目錄名-jni生成Jni樣式的標頭文件-classpath指定載入類的路徑,後面跟上你要生成頭文件的這個類的路徑,例如:..\..\..\build\intermediates\classes\debug(這個是類所在的路徑)com.example.lenovo.application.JniClass(類的包名)注意,要生成.class文件,要MakeProject3.如果前面沒有出錯的話,就能看到jni文件和生成的頭文件其實jni目錄可以不用命令生成,AndroidStudio已經為我們准備好了。這樣就能快速的生成jni目錄了。然後在Terminal中進入到該目錄,輸入命令cdapp\src\main\jni在執行如下命令javah-djni-jni-classpath..\..\build\intermediates\classes\debugcom.example.lenovo.application.JniClass這樣也能生成頭文件利用Windows的cmd生成jni頭文件1.進入到你自己Android工程目錄下的app\build\intermediates\classes\debug2.然後Shift加滑鼠右鍵,點擊紅色方框的內容3.出現cmd命令行,輸入如下命令javah-jnicom.example.lenovo.application.JniClass4.會在當前目錄生成*.h頭文件,把它拷貝進jni目錄就可以了。jni目錄可以按照上面的方法創建至此,生成jni頭文件的三種方法講解完畢。

7. android studio JNI開發時 編譯成功 但是沒有生成.so文件 什麼原因

1 在交叉編譯的時候怎麼都無法生成so文件,javah生成頭文件沒錯,c文件也沒錯,java文件也沒錯,
2.原因:是JNI文件夾路徑不對
3 在執行javah命令時,我進入的是cd app/src/main/java 這樣jni文件夾在java文件夾下,作為一個包存在,這樣就無法生成so文件
執行javah的正確姿勢:
4 進入app/src/main目錄:cd app/src/main
執行javah命令:javah

javah -d jni -classpath ./Java lab.sodino.jnitest.MainActivity

5, -d jni 頭文件生成到jni文件夾(當前在<Project>\app\src\main目錄下,所以.h所在的目錄為<Project>\app\src\main\jni )
-classpath ./java 指定去當前路徑下java下尋找包名指定的類
這樣再rebuild一下,就會生成so文件了

8. 如何給android工程添加ndk

建立項目,並設置activity.xml布局文件,這一點與普通編程沒有不同。通過一個簡單的文本展示實驗。在MainActivity中添加native介面,並載入.so庫生成項目的.class文件。首先選中項目後,在菜單欄選擇Build-->MakeProject。Make之後,將生成.class文件,生成的.class文件位於app_path/build/intermediates/classes/debug/包名利用javah生成C頭文件:點擊"View->ToolWindows->Terminal",即在Studio中進行終端命令行工具。在控制台中通過命令「cdapp\src\main\java」,進入到java目錄下。操作指令:javah-d../jnivrlab.ndkdemoforandroidstudio.MainActivity。此時在main目錄下生成一個jni文件夾,其中在jni文件夾中有生成的.h頭文件。編輯C文件,在jni文件夾下新建文件命名為main.c。並在該文件中導入需要的頭文件,實現上一步生成的頭文件中的方法。配置NDK路徑,在local.properties中指明sdk和ndk路徑:設置ndk參數,名字、發布平台等。在應用目錄下的build.gradle中defaultConfig中設置生成.so文件,此時再次選擇Build-->BuildProject就可以生成so文件了。出現不支持NDK的錯誤提示,不過跟著錯誤提示修改:在項目空間下的gradle.properties中添加android.useDeprecatedNdk=true。針對三種不同的CPU生成了三種不同的.so文件。生成的.so文件位於app_path/build/intermediates/ndk/debug/lib.安裝運行~~去吧,皮卡丘

9. android studio JNI開發時 編譯成功 但是沒有生成.so文件 什麼原因

1
在交叉編譯的時候怎麼都無法生成so文件,javah生成頭文件沒錯,c文件也沒錯,java文件也沒錯,
2.原因:是JNI文件夾路徑不對
3
在執行javah命令時,我進入的是cd
app/src/main/java
這樣jni文件夾在java文件夾下,作為一個包存在,這樣就無法生成so文件
執行javah的正確姿勢:
4
進入app/src/main目錄:cd
app/src/main
執行javah命令:javah
javah
-d
jni
-classpath
./Java
lab.sodino.jnitest.MainActivity
5,
-d
jni
頭文件生成到jni文件夾(當前在<Project>\app\src\main目錄下,所以.h所在的目錄為<Project>\app\src\main\jni

-classpath
./java
指定去當前路徑下java下尋找包名指定的類
這樣再rebuild一下,就會生成so文件了

閱讀全文

與androidjavah命令相關的資料

熱點內容
怎麼使用access的命令按鈕 瀏覽:897
有點錢app在哪裡下載 瀏覽:832
博途v15解壓後無法安裝 瀏覽:203
什麼是根伺服器主機 瀏覽:436
安卓手游怎麼申請退款 瀏覽:553
安卓系統如何分享網頁 瀏覽:278
ad如何編譯pcb工程 瀏覽:412
除了滴滴app哪裡還能用滴滴 瀏覽:399
截圖怎麼保存文件夾然後壓縮 瀏覽:8
幻影伺服器怎麼樣 瀏覽:27
具體哪些廣東公司招程序員 瀏覽:870
嵌入式編譯器教程 瀏覽:306
ssl數據加密傳輸 瀏覽:86
51單片機定時器方式2 瀏覽:331
命令行查看開機時間 瀏覽:813
python微博復雜網路分析 瀏覽:550
rf3148編程器 瀏覽:505
浙江標准網路伺服器機櫃雲主機 瀏覽:588
設置網路的伺服器地址 瀏覽:600
java圖形界面設計 瀏覽:751