I have struggled quite a lot with the error “Interface requested not found : csLIB” when trying to open a semantic layer using SAP BO SL SDK 4.1. It was quite a complex issue so I will summarize it here in case someone has a similar problem.
Here I am using a local universe Test with SQL Server connection.
The code is simple.
import com.sap.sl.sdk.authoring.businesslayer.RelationalBusinessLayer;
import com.sap.sl.sdk.authoring.local.LocalResourceService;
import com.sap.sl.sdk.framework.SlContext;
public class Test {
public static void main(String[] args) {
SlContext context = SlContext.create();
String businessLayerPath = ".\\Test.blx";
LocalResourceService service = context.getService(LocalResourceService.class);
RelationalBusinessLayer businessLayer =
(RelationalBusinessLayer) service.load(businessLayerPath);
service.close(businessLayer);
context.close();
System.out.println("OK");
}
}
Batch for compilation and execution
@echo off
set JAVA_HOME=C:/Program Files (x86)/Java/jdk1.6.0_45
set JAVA="%JAVA_HOME%/bin/java"
set JAVAC="%JAVA_HOME%/bin/javac"
set BO=C:/SAP BusinessObjects/SAP BusinessObjects Enterprise XI 4.0
set CS=%BO%/dataAccess/connectionServer
set CP=%BO%/SL SDK/java/sl_sdk.jar;%BO%/java/lib/*
set PATH=%BO%/win32_x86
%JAVAC% -classpath "%CP%" Test.java
%JAVA% -Dbusinessobjects.connectivity.directory="%CS%" -classpath "%CP%" Test
pause
Everything was done according to SL SDK documentation but I still got the error:
Exception in thread “main” com.sap.tools.commons.exception.NestedException: Interface requested not found : csLIB
Caused by: com.sap.connectivity.cs.core.CSError: Interface requested not found : csLIB
Caused by: java.lang.UnsatisfiedLinkError: C:\Program Files (x86)\SAP BusinessObjects\SAP BusinessObjects Enterprise XI 4.0\win32_x86\cs_jni.dll: The specified procedure could not be found
I started investigating DLL loading process using Process Monitor and found that the library cs_jni.dll depends on the library icuin30.dll from win32_x86. However I had an older version in the folder C:\Windows\SysWOW64\. And since the system directories are checked before going through directories in the PATH variables, a wrong version was picked.
I have overwritten the icu??30.dll libraries in SysWOW64 with the libraries from win32_x86 and the code started to work.
(The “icu” stands for “International Components for Unicode”.)
I do not know the impact of the change to other application, use it at your own risk. If you are going to try it, make backup of the existing files.