<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??一站式輕松地調用各大LLM模型接口,支持GPT4、智譜、豆包、星火、月之暗面及文生圖、文生視頻 廣告
                [TOC] # 1. 前言 在C中可以通過反射的方式來調用Java的代碼,同樣還是借助前面配置的JNI環境。這里首先配置要需要供C語言調用的Java類和方法: ~~~ public class JavaMethod { public int add(int a, int b){ System.out.println("調用了JavaMethod類中的類方法。"); return a + b; } public static void showInfo(){ System.out.println("調用了JavaMethod類中的靜態方法。"); } } ~~~ # 2. 得到方法簽名 可以使用javap命令來查看每個方法的簽名,比如可以任意打開一個cmd窗口,執行: ``` javap -s java.lang.String ``` 來查看String類中每個方法的簽名。類似的,我們可以先編譯一下這個項目,然后在build->intermediates->javac->debug->classes->com.xxx的字節碼文件下: ![](https://img.kancloud.cn/c6/f0/c6f01b0c72ca774cbd62a6038421583f_1062x157.png) 然后,拷貝這個地址,比如我這里為: ``` D:\openSourceLearnProject\Android\CustomView\myapplication\build\intermediates\javac\debug\classes\com\weizu\jnitest\JNITest.class ``` 然后執行: ``` javap -s D:\openSourceLearnProject\Android\CustomView\myapplication\build\intermediates\javac\debug\classes\com\weizu\jnitest\JNITest.class ``` 即可得到方法簽名: ![](https://img.kancloud.cn/2f/d3/2fd3042c3dfbe0bc11d050e9f7408493_424x186.png) 當然,我這里所需要的不是這個類,我所需要的是上面的JavaMethod 類,這里再次執行一下對應的javap命令,可以得到: ![](https://img.kancloud.cn/0f/cc/0fccfcea2ecda3721f4d1708b0da1e0e_460x233.png) # 3. C語言中反射Java非靜態方法 對應的在上一個案例中的native-lib.cpp中將之前的: ~~~ // native-lib.cpp #include "com_weizu_jnitest_JNITest.h" extern "C" jstring Java_com_weizu_jnitest_JNITest_helloJni( JNIEnv* env, jobject /* this */) { std::string hello = "Hello from C++"; return env->NewStringUTF(hello.c_str()); } ~~~ 修改為: ~~~ #include "com_weizu_jnitest_JNITest.h" #include <android/log.h> #define LOG_TAG "System.out" #define LOGE(...) __android_log_print(ANDROID_LOG_ERROR, LOG_TAG, __VA_ARGS__) // 在這個方法中進行C調java的反射 extern "C" jstring Java_com_weizu_jnitest_JNITest_helloJni( JNIEnv* env, jobject /* this */) { std::string hello = "Hello from C++"; // 1. 字節碼 jclass jclazz = (*env).FindClass("com/weizu/jnitest/JavaMethod"); // 2. 方法add jmethodID jmethodId = (*env).GetMethodID(jclazz, "add", "(II)I"); // 3. 實例化類 jobject jobjectInstance = (*env).AllocObject(jclazz); // 4. 調用方法 jint result = (*env).CallIntMethod(jobjectInstance, jmethodId, 24, 26); LOGE("在C語言中計算結果為:%d\n", result); return env->NewStringUTF(hello.c_str()); } ~~~ 因為在MainActivity中調用了這個方法,且打印結果在日志中: ~~~ class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) Log.e("TAG", "onCreate: ${JNITest().helloJni()}" ) } } ~~~ 直接運行程序,查看一下日志信息,就可以知道是否成功: ![](https://img.kancloud.cn/2c/b0/2cb0d57bdcb83fa790a326f542a8488f_1188x248.png) # 4. C語言中反射Java靜態方法 我們在寫Java中的反射的時候已經比較熟悉了,這里將上面的方法做一個簡單的修改: ~~~ // 在這個方法中進行C調java的反射 extern "C" jstring Java_com_weizu_jnitest_JNITest_helloJni( JNIEnv* env, jobject /* this */) { std::string hello = "Hello from C++"; // 1. 字節碼 jclass jclazz = (*env).FindClass("com/weizu/jnitest/JavaMethod"); // 2. 方法add jmethodID jmethodId = (*env).GetStaticMethodID(jclazz, "showInfo", "()V"); // 靜態方法不需要實例化類 // jobject jobjectInstance = (*env).AllocObject(jclazz); // 3. 調用方法 (*env).CallStaticVoidMethod(jclazz, jmethodId); LOGE("在C語言中調用了Java的靜態方法。\n"); return env->NewStringUTF(hello.c_str()); } ~~~ ![](https://img.kancloud.cn/82/76/827635982e734996361e2b32f60a6d70_990x241.png)
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看