【问题标题】:JNK export function callJNK导出函数调用
【发布时间】:2013-12-14 05:39:07
【问题描述】:

我在 wiki 中看到与此类似的示例:

定义:

 JNIEXPORT void JNICALL Java_HelloWorld_print(JNIEnv *env, jobject obj)
 {
     printf("Hello World!\n");
     return;
 }

在java中调用:

class HelloWorld
{
    private native void print();
    public static void main(String[] args)
    {
        new HelloWorld().print();
    }
    static{
        System.loadLibrary("HelloWorld");
    }
}

但是当我想将 jstring 传递给函数时。

定义和调用需要做哪些修改?

类似这样:

Java_HelloWorld_print(JNIEnv *env, jobject obj, jstring 路径)

private native void print(....)

调用时打印参数中需要有什么参数?

【问题讨论】:

    标签: java java-native-interface


    【解决方案1】:

    Java 部分很简单:

     private native void print(String path);
    

    C 部分,不多说:

     JNIEXPORT void JNICALL Java_HelloWorld_print(JNIEnv *jenv, jobject obj, jstring path)
     {
        char* arg2 = 0;
        if (path) {
           arg2 = (char *)(*jenv)->GetStringUTFChars(jenv, path, 0);
           if (!arg2) return;
        }
    
        printf("%s\n", arg2);
        if (arg2) (*jenv)->ReleaseStringUTFChars(jenv, path, (const char *)arg2);
        return;
     }
    

    【讨论】:

    • 为什么在我的 Eclipse 中,它对 GetStringUTFChars 的定义是“ const char* GetStringUTFChars(jstring string, jboolean* isCopy) { return functions->GetStringUTFChars(this, string, isCopy); }” 所以我将我们的行修改为“ unsigned char* arg2 = 0; jenv->GetStringUTFChars(path, arg2);”。有什么问题
    • 区别在于 C++ JNI API,而不是我展示的 C JNI API。有关对比 C 和 C++ API 的一些类似代码,请参阅 here
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-05-02
    • 2014-04-30
    • 1970-01-01
    • 2011-02-24
    • 1970-01-01
    • 2011-01-16
    • 1970-01-01
    相关资源
    最近更新 更多