2015-05-08 23 views
0

我已经能够成功构建C++共享库并使用Java原生函数访问Android上的代码。我正在尝试在iOS上重现此项工作。使用CMake,我可以配置和构建我的共享库作为.dylib,并在我的iPhone/iPad模拟器上加载System.loadLibrary()。但是,当我调用本机函数时,我得到一个UnsatisfiedLinkError。通过nm进行快速检查,验证是否按照我的预期导出了JNI函数。有人可以告诉我我做错了什么吗?我需要以某种方式修改Apple的本地函数名称吗?从nmiOS上的原生JNI

输出示例:

000000000011Ce0 T _Java_com_test_Native_getPointer 

而在Native.java

public static native long getPointer(); 

在C++代码:

extern "C" { 
JNIEXPORT jlong JNICALL Java_com_test_Native_getPointer(JNIEnv* env, jobject thiz) 
{ 
    return (jlong)0; 
} 

错误是:

java.lang.UnsatisfiedLinkError: com/test/Native.getPointer(I)J 

已解决!

我已键入手工方法签名看着另一个屏幕,一不小心忽略了一个关键因素:

JNIEXPORT jlong JNICALL Java_com_test_Native_getPointer(JNIEnv* env, jobject thiz, int test) 

卸下int test解决了这个问题。

+0

是'com.test'包中的'Native'类吗? – technomage

回答

0

解决: 我已键入手工方法签名看着另一个屏幕,一不小心忽略了一个关键因素:

JNIEXPORT jlong JNICALL Java_com_test_Native_getPointer(JNIEnv* env, jobject thiz, int test) 

卸下int test解决了这个问题。

+0

jni可以与iOS一起使用吗?因为JavaVM框架仅适用于OS X. –