1. 程式人生 > >JNI基礎(六)C調java程式碼

JNI基礎(六)C調java程式碼

java如何呼叫C程式碼,大概已經瞭解了,通過是先本地方法來呼叫。那麼C程式碼如何代用java程式碼

套路與思路:通過反射

java程式碼:

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        final JNI jni = new JNI();
        final int[] arr = {1,2,3,4,5};
        ((Button) findViewById(R.id.bt_fuck)).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
              jni.cinovkejavashow();
            }
        });
    }

    public void show(){
        Log.i("mydata","呵呵,我被呼叫了");
    }
}

public class JNI {

    /**
     * 載入動態連結庫
     * 也就是c程式碼編譯好的so檔案
     */
    static {
        System.loadLibrary("app");
    }

    public native void cinovkejavashow();

}

C程式碼:
/*
 * Class:     com_example_jnidemo_JNI
 * Method:    cinovkejavashow
 * Signature: ()V
 */
JNIEXPORT void JNICALL Java_com_example_jnidemo_JNI_cinovkejavashow (JNIEnv *env, jobject obj){
    //通過反射獲取到類
    jclass  jclazz = (*env)->FindClass(env,"com/example/jnidemo/MainActivity");
    //通過反射獲取到方法
    /**
     * 第一個引數:虛擬機器指標
     * 第二個引數:方法所在class
     * 第三個引數:方法名
     * 第四個引數:方法簽名(javap -s class全類名(位元組碼的全類名))
     */
    jmethodID jmethod = (*env)->GetMethodID(env,jclazz,"show","()V");

    /**
     * 建立類例項
     */
    jobject  jobject1 = (*env)->AllocObject(env,jclazz);

    //呼叫方法
    /**
     * 第一個引數:java虛擬機器
     * 第二個引數:呼叫此方法的例項
     * 第三個引數:jmethodID
     */
    (*env)->CallVoidMethod(env,jobject1,jmethod);
}
啊哈哈哈哈和

相關推薦

JNI基礎C調java程式碼

java如何呼叫C程式碼,大概已經瞭解了,通過是先本地方法來呼叫。那麼C程式碼如何代用java程式碼 套路與思路:通過反射 java程式碼: public class MainActivity ext

JNI基礎C調java靜態方法程式碼

上次記錄了一下如何呼叫java程式碼,但是java方法有靜態與非靜態之分,所以呼叫方式也是不一樣的。 java程式碼: public class MainActivity extends AppCom

Android JNI程式設計——C語言函式指標、Unition聯合體、列舉、Typedef別名、結構體、結構體指標

一:函式指標 1.函式指標顧名思義就是定義一個指標變數指向一個函式,和一級指標並沒有很大的區別我們看如下程式碼就很清楚的知道了 #include<stdio.h> #include<stdlib.h> //定義一個函式 in

JNI/NDK開發指南——C/C++訪問Java例項方法和靜態方法

        通過前面5章的學習,我們知道了如何通過JNI函式來訪問JVM中的基本資料型別、字串和陣列這些資料型別。下一步我們來學習原生代碼如何與JVM中任意物件的屬性和方法進行互動。比如原生代碼呼叫Java層某個物件的方法或屬性,也就是通常我們所說的來自C/C++層本地函

java並發基礎--- 活躍性、性能與可伸縮性

.get tro t對象 解決辦法 很難 之間 然而 exce 更多   《java並發編程實戰》的第9章主要介紹GUI編程,在實際開發中實在很少見到,所以這一章的筆記暫時先放一放,從第10章開始到第12章是第三部分,也就是活躍性、性能、與測試,這部分的知識偏理論多一些,但

c++基礎

選擇 對象 pri 也會 () 定義 沒有 可能 接口 標識符的作用域與可見性 作用域是一個標識符在程序正文中有效的區域。 作用域分類 函數原型作用域 局部作用域(塊作用域) 類作用域 文件作用域 命名空間作用域(詳見第10章) 函數原形作用域 函數原型中的參數,

OpenCV(C++) 基礎-- 繪製輪廓與分割修復

1.尋找輪廓: findContours() void findContours(src, contours, hierarchy, mode, method, offset); // hierarchy: 影象拓撲資訊,可選 // mode: 輪廓檢索模式,RETR_EX

java基礎抽象類abstract class和介面Interface

抽象類(abstract class)和介面(Interface)是Java語言中對於抽象類定義進行支援的兩種機制,賦予了Java強大的面向物件能力。 二者具有很大的相似性,甚至可以相互替換,因此很多開發者在進行抽象類定義時對於abstractclass和Interface的選擇顯得比較

C# 基礎C# 十進位制、二進位制、八進位制、十進位制

一、轉換 //十進位制轉二進位制 Console.WriteLine(Convert.ToString(69, 2)); //十進位制轉八進位制 Console.WriteLine(Convert.ToString(69, 8)); //十進位制轉十六進位制 Console

Java基礎深入解讀泛型1

一名合格的Java程式設計師,當然要經常翻翻JDK的原始碼。經常看JDK的API或者原始碼,我們才能更加了解JDK,才能更加熟悉底層。 一、引出泛型 然而,在看原始碼的過程中,我們經常會看到類似於如下這樣的程式碼: private void putAllForCreat

C++ 基礎.dll檔案的動態載入和靜態載入的區別:畫圖並舉例說明

一、簡介 本部落格主要介紹.dll檔案的動態載入和靜態載入的區別,畫圖並舉例說明。此外,我的上一篇關於靜態載入的部落格如下: C++ 基礎(五)使用vs2015封裝c++生成.dll檔案、.lib檔案、.h檔案後,給另一個工程使用:使用前,需配置標頭檔案(.h)靜態庫(.lib)和 動態庫(

c語言基礎靜態和動態記憶體分配

1.靜態記憶體是程式編譯執行後系統自動分配,由系統自動釋放,靜態記憶體是棧分配的 第一次執行完畢後i就被釋放了,所以後面輸出的為垃圾值 2.動態記憶體分配是開發者手動分配的,是堆分配的 malloc(int)函式申請記憶體空間 free()回收 realloc()重新分

Java還要再學一遍基礎ArrayList詳解

ArrayList概要。 ArrayList是一個容量可變的動態陣列,繼承了AbstractList,並且AbstractList已經實現了一些基本的增刪改查,ListIterator等功能,ArrayList更關注的是內部的的陣列實現。 ArrayList

C語言基礎

功能 大小 間接 常量 也不能 eof 但是 降級 一個 一、指針的定義和使用:   1.指針     是一種數據類型 指針變量也是一種變量   2.指針格式     對應的數據類型 * p:指針類型變量 用來指向一個變量的地址   3.通過指針修改變量的值*p

Java 基礎:迴圈

### 迴圈 老生常談的一個控制流程了,我們在是使用陣列和集合的時候,遍歷元素的時候經常會用到迴圈的結構,Java具有非常靈活的三種迴圈機制: ![image-20190827222828453](http://viyoungblog.oss-cn-beijing.aliyuncs.com/2019-08

Java 多執行緒基礎執行緒等待與喚醒

 Java 多執行緒基礎(六)執行緒等待與喚醒 遇到這樣一個場景,當某執行緒裡面的邏輯需要等待非同步處理結果返回後才能繼續執行。或者說想要把一個非同步的操作封裝成一個同步的過程。這裡就用到了執行緒等待喚醒機制。 一、wait()、notify()、notifyAll() 等方法介紹 在 Object

Python學習day9--linux基礎

sdn zip install bsp docs sbin service dev 網卡 今天我們來看一下Samba服務和nginx服務。 Samba服務 1.samba的功能 samba是一個網絡服務器,用於Linux和Windows之間共享文件。 2.samba服

mysql基礎mysql事務

mysqlmysql事務:是一個獨立的工作單元 事務必須通過ACID測試: 原子性(Atomicity):一個事務的所有操作要麽全部成功執行,要麽全部失敗後回滾 一致性(Consistency):數據庫總是從一個一致性狀態轉換成另一個狀態 隔離性(Isolation):一個事務在做出

mysql基礎select語句

mysql單表查詢: SELECT [ DISTINCT ] [SQL_CACHE | SQL_NO_CACHE] select_expr [,select_expr ...] [FROM table_references [ WHERE

mysql基礎之sqlAchemy

true syn lte color 模塊 實例化 codefirst pow import 參考博客:http://www.cnblogs.com/wupeiqi/articles/5713330.html函數編程:數據和邏輯分離 a= 123 b