我正在其中一个移动应用程序中将代码从Java转换为Kotlin,而Java中可用的代码停止在Kotlin中运行。它使用JNI桥来调用C ++代码。
Kotlin方法声明:
class Converter{
companion object {
external fun convertNative(width: Int, height: Int, row: Int, input: ByteArray, ft: Int, output: ByteArray)
}
}
.cc代码:
extern "C" {
JNIEXPORT void JNICALL OBJECT_TRACKER_METHOD(convertNative)(JNIEnv* env, jobject thiz, jint width, jint height, jint row,
jbyteArray input, jint ft, jbyteArray output);
}
JNIEXPORT void JNICALL OBJECT_TRACKER_METHOD(convertNative)(
JNIEnv* env, jobject thiz, jint width, jint height, jint row,
jbyteArray input, jint ft, jbyteArray output) {...}
我得到的错误:
java.lang.UnsatisfiedLinkError:No implementation found for void com.sampleapp.Converter$Companion.convertNative(int,int,int,byte[],int,byte[])(tried Java_com_sampleapp_Converter_00024Companion_convertNative and Java_com_sampleapp_Converter_00024Companion_convertNative__III_3BI_3B) at com.sampleapp.Converter$Companion.convertNative(Native Method)...
原始的JAVA方法(可以正常工作)
protected static native void convertNative(
int width, int height, int row, byte[] input, int ft, byte[] output);
在两种情况下,都可以使用System.loadLibrary(我看到正确的日志输出,没有错误)正确加载该库。
答案 0 :(得分:2)
如果要避免更改C ++代码,则应使用@JvmStatic
来注释Kotlin函数,即:
@JvmStatic external fun convertNative(width: Int, height: Int, row: Int, input: ByteArray, ft: Int, output: ByteArray)
顺便说一句,您的C ++函数声明在技术上是不正确的:对于静态方法,第二个参数是jclass
,而不是jobject
。