1. 自己寫.c文件,然后生成so庫(kù)
創(chuàng)新互聯(lián)公司專注于蔡甸網(wǎng)站建設(shè)服務(wù)及定制,我們擁有豐富的企業(yè)做網(wǎng)站經(jīng)驗(yàn)。 熱誠(chéng)為您提供蔡甸營(yíng)銷型網(wǎng)站建設(shè),蔡甸網(wǎng)站制作、蔡甸網(wǎng)頁(yè)設(shè)計(jì)、蔡甸網(wǎng)站官網(wǎng)定制、微信小程序開發(fā)服務(wù),打造蔡甸網(wǎng)絡(luò)公司原創(chuàng)品牌,更為您提供蔡甸網(wǎng)站排名全網(wǎng)營(yíng)銷落地服務(wù)。
2. 引用別人的鏈?zhǔn)朱o態(tài)庫(kù),或者動(dòng)態(tài)庫(kù)來(lái)生成新的jni調(diào)用庫(kù)。
我們先來(lái)看最簡(jiǎn)單的編寫一個(gè)jni調(diào)用的so庫(kù),包含一個(gè)獲棚讓嫌取字符串的方法,通過(guò)這個(gè)列子,我們主要是了解怎滑仔么在android的工程中調(diào)用jni的庫(kù),以及要注意的問題。
第一步:首先我們來(lái)看下我們的工程的目錄
jni目錄是我們生成庫(kù)的文件,里面包含了一個(gè).mk編譯文件以及一系列的.c文件
libs目錄是我們編譯jni目錄下的mk文件動(dòng)態(tài)生成的。
當(dāng)我們寫好了jni下面的庫(kù)文件以后,在當(dāng)前目錄下執(zhí)行ndk-build則會(huì)自動(dòng)生成我們需要調(diào)用的.so庫(kù)文件。
第二步: java里面怎么調(diào)用jni的庫(kù)文件,我們先看代碼
public class MainActivity extends Activity {
/* A native method that is implemented by the
* 'hello-jni' native library, which is packaged
* with this application.
*/
public native String stringFromJNI();
/* this is used to load the 'hello-jni' library on application
* startup. The library has already been unpacked into
* /data/data/com.example.HelloJni/lib/libhello-jni.so at
* installation time by the package manager.
*/
static {
System.loadLibrary("hello-jni");
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
String str = stringFromJNI();
System.out.println("*****str:" + str);
}
}
在java文件中要做到調(diào)用jni文件生成的so庫(kù),需要做到2步
Android.mk文件:
LOCAL_SRC_FILES參數(shù)用空格隔開
[c-sharp]?view plaincopyprint?
LOCAL_PATH:=$(call?my-dir)
include?$(CLEAR_VARS)
LOCAL_MODULE:=native
LOCAL_SRC_FILES:=geolo.cpp?my_jni.h
include?$(BUILD_SHARED_LIBRARY)
2. geolo.cpp
先用FindClass方法找到則激禪java類,鉛胡有點(diǎn)類似java的反射用LoadClass
再用CallObjectMethod方法調(diào)用Java類的函數(shù)。
[c-sharp]?view plaincopyprint?
#include?"my_jni.h"
jobject?getInstance(JNIEnv*?env,?jclass?obj_class){
jmethodID?construction_id?=?env-GetMethodID(obj_class,?"init",?"()V");
jobject?obj?=?env-NewObject(obj_class,?construction_id);
return?obj;
}
JNIEXPORT?jstring?JNICALL?Java_com_easepal_geolo_CActivityMain_stringFromJNI(JNIEnv*?env,?jobject?thiz){
jstring?str;
jclass?java_class?=?env-FindClass("com/easepal/geolo/CForCall");
if?(java_class?==?0){
return?env-NewStringUTF("not?find?class!");
}
jobject?java_obj?=?getInstance(env,?java_class);
if?(java_obj?==?0){
return?env-NewStringUTF("not?find?java?OBJ!");
}
jmethodID?java_method?=?env-GetMethodID(java_class,?"GetJavaString",?"()Ljava/lang/String;");
if(java_method?==?0){
return?env-NewStringUTF("not?find?java?method!");
}
str?=?(jstring)env-CallObjectMethod(java_obj,?孫塵java_method);
return?str;
}
3. my_jni.h
[c-sharp]?view plaincopyprint?
/*?DO?NOT?EDIT?THIS?FILE?-?it?is?machine?generated?*/
#include?jni.h
/*?Header?for?class?com_easepal_geolo_CActivityMain?*/
#ifndef?_Included_com_easepal_geolo_CActivityMain
#define?_Included_com_easepal_geolo_CActivityMain
#ifdef?__cplusplus
extern?"C"?{
#endif
/*
*?Class:?????com_easepal_geolo_CActivityMain
*?Method:????stringFromJNI
*?Signature:?()Ljava/lang/String;
*/
JNIEXPORT?jstring?JNICALL?Java_com_easepal_geolo_CActivityMain_stringFromJNI(JNIEnv?*,?jobject);
#ifdef?__cplusplus
}
#endif
#endif
4.?CActivityMain.java
[c-sharp]?view plaincopyprint?
package?com.easepal.geolo;
import?android.app.Activity;
import?android.os.Bundle;
import?android.widget.TextView;
public?class?CActivityMain?extends?Activity?{
/**?Called?when?the?activity?is?first?created.?*/
@Override
public?void?onCreate(Bundle?savedInstanceState){
super.onCreate(savedInstanceState);
TextView?tv?=?new?TextView(this);
tv.setText(?stringFromJNI("hello")?);
setContentView(tv);
}
static?{
System.loadLibrary("native");
}
public?native?String?stringFromJNI(String?str);
}
5.?CForCall.java
[c-sharp]?view plaincopyprint?
package?com.easepal.geolo;
public?class?CForCall{
public?CForCall(){};
//public?~CForCall(){};
public?String?GetJavaString(){
String?str;
str?=?"123456";
return?str;
}
}
可以調(diào)用,但是不能直接調(diào)用,要通過(guò)代碼目的JNI去調(diào)用,在JNI中導(dǎo)入頭文件,通過(guò)NDK編譯成功后即可。
NDK編譯步驟:
1.選擇 ndk 自帶的例子 hello-jni ,我的雀裂敗位于E:\android-ndk-r5\samples\hello-jni( 根據(jù)具體的安裝位置而定 ) 。
2.運(yùn)頃顫行 cygwin ,輸入命令 cd /cygdrive/e/android-ndk-r5/samples/hello-jni ,進(jìn)入到 E:\android-ndk-r5\samples\hello-jni 目錄。
3.輸入源納 $NDK/ndk-build ,執(zhí)行成功后,它會(huì)自動(dòng)生成一個(gè) libs 目錄,把編譯生成的 .so 文件放在里面。 ($NDK是調(diào)用我們之前配置好的環(huán)境變量, ndk-build 是調(diào)用 ndk 的編譯程序 )
4.此時(shí)去 hello-jni 的 libs 目錄下看有沒有生成的 .so 文件,如果有,ndk 就運(yùn)行正常啦。
新聞名稱:ndk調(diào)用java代碼 jdk ndk sdk
文章網(wǎng)址:http://vcdvsql.cn/article48/ddpsgep.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供搜索引擎優(yōu)化、網(wǎng)站內(nèi)鏈、網(wǎng)站設(shè)計(jì)公司、網(wǎng)站改版、外貿(mào)建站、企業(yè)網(wǎng)站制作
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)