androidc調用java
㈠ 請問在android開發中,如何問在jni中調用java類的用synchronized修飾的靜態方法
那個返回類型可能也需要加上分號結尾。看圖中有文本編輯器打開一個class文件的例子。synchronized 本身不是簽名的一部分,按理說它僅影響執行時的過程,不影響查找方法本身。
㈡ Android程序可以調用C函數嗎 我需要使用C訪問Android底層,然後希望Android程序調用C程序。
在一些Android應用的開發中,需要通過JNI和 Android NDK工具實現JAVA和C/C++之間的相互調用。
Java Native Interface (JNI)標準是java平台的一部分,它允許Java代碼和其他語言寫的代碼進行交互。JNI是本地編程介面,它使得在 Java 虛擬機 (VM)內部運行的 Java代碼能夠與用其它編程語言(如 C、C++和匯編語言)編寫的應用程序和庫進行交互操作。
NDK提供了一系列的工具,幫助開發者快速開發C(或C++)的動態庫,並能自動將so和java應用一起打包成apk。這些工具對開發者的幫助是巨大的。NDK集成了交叉編譯器,並提供了相應的mk文件隔離CPU、平台、ABI等差異,開發人員只需要簡單修改mk文件(指出「哪些文件需要編譯」、「編譯特性要求」等),就可以創建出so。NDK可以自動地將so和Java應用一起打包,極大地減輕了開發人員的打包工作。
㈢ 關於Android開發中Java對於.so庫的調用
android掉用c的so包就是通過jni
,
應該給你的jar包就是用來調用so包的
。不會讓你直接掉so包的放心。so包一般都是為了保證核心代碼不被反編譯
,另外就是效率高才會用,或者就是開發游戲
。
他們說夠用應該是jar包已經和so包的jni調用介面都調好了
,
你用jar包就行了
㈣ android源碼里 c調java error: undefined reference to 'JNI_CreateJavaVM'求助
android 裡面的java調用c,主要是通過ndk組件來實現的,env和vm都是系統創建好了的,可以直接調用的,看的出來樓主應該是ndk方面的初學者,對jni,ndk這些東西的關系應該沒有弄清楚,如果僅僅是一個java和c互掉的話,可以看我的帖子「ndk java 和 c 互掉」:
http://jingyan..com/article/f54ae2fcde72be1e92b84916.html
帖子集文檔,截圖,視頻於一體,涉及java調用c和c調用java兩部分,
由於感覺你是ndk的初學者,所以有時間的話,建議你看看我總結的帖子"android ndk資源匯總":
http://tieba..com/p/3439627347
希望對你有用,我是ndk吧吧主,有問題可以ndk吧留言,謝謝!
㈤ 在android上用C語言
安卓也可以用C語言編寫,這種方式程序效率高,但需要一些底層知識。。。(即所謂NDK),Android在支持NDK後是可以實現用C和C++來編寫的。因為用C++比較多,之前用cocos2d-x寫過Demo游戲。就使用了NDK編譯出.so文件然後放入Android工程用在Java層調用。Android SDK的Java層是可以通過JNI和C/C++進行數據交互的。
詳見:
Android NDK | Android Developers
The NDK is a toolset that allows you to implement parts of your app using native-code languages such as C and C++. For certain types of apps, this can be helpful so you can reuse existing code libraries written in these languages, but most apps do not need the Android NDK.
㈥ c調用java方法的時候CallObjectMethod這個方法一直錯誤,代碼貼上
Android.mk文件: LOCAL_SRC_FILES參數用空格隔開 [c-sharp] view plainprint? LOCAL_PATH:=$(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE:=native LOCAL_SRC_FILES:=geolo.cpp my_jni.h include $(BUILD_SHARED_LIBRARY)
㈦ 關於Android開發中Java對於.so庫的調用
廠家並沒有欺騙你或者是含糊你的意思,確實是只提供給你jar包以及 so 庫就可以了,做法是這樣子的:
1.比如我現在在用net.sqlcipher.database 這個加密庫(網上能搜得到的,用於資料庫加密)。 那麼我現在就在項目用載入這個jar包(在你的項目單擊右鍵-》屬性-》Java Build Path-》Libraries-》Add Jars,選擇提供給你的jar包,我這里是 sqlcipher.jar,然後在Order and Export勾選你剛剛載入的 jar包。)
2.打開你的workspace目錄,在你的項目目錄下創建一個文件夾libs(如果文件夾不存在的話),然後將提供給你的so庫放入該目錄,基本架構就算是搭建好了。
3.進行開發,這里你需要問一下提供給你jar包的廠家,基本的用法,否則的話是無法進行開發的,因為你都不知道怎麼去用。 sqlcipher的基本用法是:
SQLiteDatabase.loadLibs(this); //載入 so庫文件,你的廠家的方法應該也是類似。
File databaseFile = getDatabasePath(SQLite_toll.DATABASE_NAME);
databaseFile.mkdirs();
databaseFile.delete();
SQLiteDatabase database = SQLiteDatabase.openOrCreateDatabase(databaseFile, helper_SharedPreferences.get_str_sp("database_cipher",this), null);
SQLite_toll initToll = new SQLite_toll(this, avaSys);
initToll.onCreate(database);
database.close();
//因為我sqlcipher是用於資料庫加密的,所以你所看到的都是資料庫的一些方法,你廠家提供給你的jar包的用法,你是要去問他們的,或者他們的是否有開源代碼,又或者是網上也有很多人使用,那麼能搜到相關資料。
根據你補充的提問,那麼就是System.loadLibrary(this); ,就可以調用了
㈧ 如何在C/C++中調用Java
JNI允許從本機代碼內調用 Java 類方法。
要做到這一點,通常必須使用 Invocation API 在本機代碼內創建和初始化一個 JVM。
下列是您可能決定從 C/C++ 代碼調用Java 代碼的典型情況:
1.希望實現的這部分代碼是平台無關的,將用於跨多種平台使用的功能。
2.需要在本機應用程序中訪問用 Java 語言編寫的代碼或代碼庫。
3.希望從本機代碼利用標准 Java 類庫。
從C/C++ 程序調用 Java 代碼的四個步驟:
1.編寫 Java 代碼。
這個步驟包含編寫一個或多個 Java 類,這些類實現(或調用其它方法實現)想要訪問的功能。
2.編譯 Java 代碼。
在能夠使用這些 Java 類之前,必須成功地將編譯成位元組碼。
3.編寫 C/C++ 代碼。
這個代碼將創建和實例化 JVM,並調用正確的 Java 方法。
㈨ 如何用c++和java開發android應用
Android應用是以Java為外殼的,C艹代碼得先通過NDK交叉編譯成.so共享庫再由Java調用,C艹代碼和Java交互是使用jni來實現,Android已經有了 Native Interface,其中就用到了很多jni的內容。JNI全名Java native interface。
㈩ android ndk 開發,C++ 調用Java的方法
Android.mk文件:
LOCAL_SRC_FILES參數用空格隔開
[c-sharp]view plainprint?
LOCAL_PATH:=$(callmy-dir)
include$(CLEAR_VARS)
LOCAL_MODULE:=native
LOCAL_SRC_FILES:=geolo.cppmy_jni.h
include$(BUILD_SHARED_LIBRARY)
2. geolo.cpp
先用FindClass方法找到java類,有點類似java的反射用LoadClass
再用CallObjectMethod方法調用Java類的函數。
[c-sharp]view plainprint?
#include"my_jni.h"
jobjectgetInstance(JNIEnv*env,jclassobj_class){
jmethodIDconstruction_id=env->GetMethodID(obj_class,"<init>","()V");
jobjectobj=env->NewObject(obj_class,construction_id);
returnobj;
}
JNIEXPORTjstringJNICALLJava_com_easepal_geolo_CActivityMain_stringFromJNI(JNIEnv*env,jobjectthiz){
jstringstr;
jclassjava_class=env->FindClass("com/easepal/geolo/CForCall");
if(java_class==0){
returnenv->NewStringUTF("notfindclass!");
}
jobjectjava_obj=getInstance(env,java_class);
if(java_obj==0){
returnenv->NewStringUTF("notfindjavaOBJ!");
}
jmethodIDjava_method=env->GetMethodID(java_class,"GetJavaString","()Ljava/lang/String;");
if(java_method==0){
returnenv->NewStringUTF("notfindjavamethod!");
}
str=(jstring)env->CallObjectMethod(java_obj,java_method);
returnstr;
}
3. my_jni.h
[c-sharp]view plainprint?
/*DONOTEDITTHISFILE-itismachinegenerated*/
#include<jni.h>
/*Headerforclasscom_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;
*/
JNIEXPORTjstringJNICALLJava_com_easepal_geolo_CActivityMain_stringFromJNI(JNIEnv*,jobject);
#ifdef__cplusplus
}
#endif
#endif
4.CActivityMain.java
[c-sharp]view plainprint?
packagecom.easepal.geolo;
importandroid.app.Activity;
importandroid.os.Bundle;
importandroid.widget.TextView;
{
/**.*/
@Override
publicvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
TextViewtv=newTextView(this);
tv.setText(stringFromJNI("hello"));
setContentView(tv);
}
static{
System.loadLibrary("native");
}
(Stringstr);
}
5.CForCall.java
[c-sharp]view plainprint?
packagecom.easepal.geolo;
publicclassCForCall{
publicCForCall(){};
//public~CForCall(){};
publicStringGetJavaString(){
Stringstr;
str="123456";
returnstr;
}
}